-1

我有这样的要求,我需要删除过去 800 天内未进行交易的所有客户

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

所有的交易表数据都在名为 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 表中。

谢谢王子

4

2 回答 2

1

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

声明@DMinus600 datetime = INSERT INTO Tempcard (CreditcardID,transactiondatetime,IdleTransactionDays) SELECT CreditcardID,transactiondatetime, DATEDIFF(DAY ,CreditcardTransaction.transactiondatetime ,getdate()) FROM CreditcardTransaction

Select * From Tempcard Where IdleTransactionDays>600

希望这会有所帮助,安迪

于 2012-04-17T19:52:10.683 回答
0

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

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

如果您的源查询仍然超时,请检查是否存在任何索引并且它们是否过于碎片化。

您还可以按年份对源数据进行分区(基于事务日期时间)。这样,数据将被突发加载。

于 2012-04-13T07:52:45.557 回答