2012-04-13 118 views
-1

我有一个需求量的这样,我需要删除所有谁没有做过transaaction过去800天客户的体积庞大的SQL Server问题处理数据

我有一个表客户那里的customerID是主键 * 的信用卡表具有的customerID,CreditcardID,其中的信用卡是一个主键具有柱transactiondatetime * Transcation表,CreditcardID列,CreditcardTransactionID这里是在该表中的primarary键。

所有transcationtable数据是在一个名为CreditcardTransaction的观点,所以我使用的视图来获取信息

我已经写了一个查询来获取谁已过去800天进行交易的信用卡,并得到他们的CreditcardID并将其存储在表 中作为数据量CreditcardTransaction视图大约为60毫秒数据查询我写入失败并记录消息日志文件已满并且引发消息系统内存异常。

INSERT INTO Tempcard 
     SELECT CreditcardID,transactiondatetime 
     FROM CreditcardTransaction WHERE 
     DATEDIFF(DAY ,CreditcardTransaction.transactiondatetime ,getdate())>600 

,因为我需要是他们最后一次Transactiondatetime

需要显示了在Excel工作表中他们的数据的话,我在数据正在倾倒的表,然后将其插入到Excel时,为了获得CreditcardID。

什么是德最好的解决方案,我表明继续在这里

我使用SSIS包(VS 2008 R2),在那里我叫SP转储数据到表,然后做一些业务逻辑的最终插入数据卓越表单。

感谢 王子

回答

0

您目前由行插入的记录行。您可以创建一个SSIS包,用OLEDB源组件读取您的数据,执行必要的操作并将它们(最少记录的操作)批量插入目标表中。

您也可以将您的行直接输出到Excel文件中。将行写入中间表会降低性能。

如果您的源查询仍超时,请调查是否存在任何索引并且它们没有太多碎片。

您还可以按年份划分源数据(基于transactiondatetime)。这样数据将以突发方式加载。

1

一个想法:在Where子句中使用函数可能会减慢速度 - 相当多。考虑添加一个名为IdleTransactionDays的列。这将允许您在Select子句中使用DateDiff函数。稍后,您可以查询Tempcard表进行IdleTransactionDays大于600返回记录 - 类似于此:

声明@ DMinus600日期时间= INSERT INTO Tempcard (CreditcardID,transactiondatetime,IdleTransactionDays) SELECT CreditcardID,transactiondatetime,DATEDIFF (DAY,CreditcardTransaction。transactiondatetime,GETDATE()) FROM CreditcardTransaction

SELECT * FROM Tempcard 凡IdleTransactionDays> 600

希望这有助于 安迪