2012-04-13 162 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

希望這有助於 安迪