处理大量数据的Sql server问题

时间:2012-04-13 06:03:23

标签: sql-server-2005 ssis

我有这样的要求我需要删除过去800天没有完成交易的所有客户

我有一个表客户,其中customerID是主键 * 信用卡表有customerID,CreditcardID列,其中creditcard是主键 * 具有列transactiondatetime的交易表,CreditcardID,CreditcardTransactionID这里是此表中的主要关键字。

所有的transcationtable数据都在名为CreditcardTransaction的视图中,所以我使用视图来获取信息

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

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

因为我需要在最后一次Transactiondatetime时获得CreditcardID

需要在Excel工作表中显示他们的数据,因此,我将数据转储到表中,然后将它们插入Excel。

我展示的最佳解决方案是什么?

我正在使用SSIS包(对比2008 R2),我将SP转储数据调用到表中,然后执行一些业务逻辑,最后将数据插入到Excel工作表中。

由于 王子

2 个答案:

答案 0 :(得分:1)

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

声明@ DMinus600 datetime = 插入Tempcard (CreditcardID,transactiondatetime,IdleTransactionDays)        SELECT CreditcardID,transactiondatetime,DATEDIFF(DAY,CreditcardTransaction.transactiondatetime,getdate())        来自CreditcardTransaction

选择*来自Tempcard IdleTransactionDays> 600

的地方

希望这有帮助, 安迪

答案 1 :(得分:0)

目前,您正在逐行插入这些记录。您可以创建一个SSIS包,该包使用OLEDB源组件读取数据,执行必要的操作,并批量插入它们(最小化记录操作)到目标表中。

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

如果您的源查询仍然超时,请调查是否存在任何索引并且它们不会过于分散。

您还可以按年度对源数据进行分区(基于transactiondatetime)。这样,数据将以突发方式加载。