2013-05-30 37 views
1

所以我有一個腳本:SSIS數據流性能緩慢VS選擇成

select * 
into my_archive_05302013 
from archive_A 
where my_Date = '05/18/2013' 

和:

insert into archive_B (ID,my_date,field_n) 
select ID, my_Date,field_n from my_archive_05302013 

其中field_n n爲約100個左右。換句話說,我正在加載的表中有100多列。

運行得非常快,查詢會插入大約200000條記錄。 my_date是在表中的非聚集索引archive_A

現在,當我創建一個使用SSIS 2008需要小時完成

我在OLE DB源的以下數據流:

SELECT * FROM Archive_A 
WHERE My_Date = (SELECT MAX(My_Date) from Archive_A) 

和OLE DB目標:

數據訪問模式:「表或視圖 - 快速加載」 表名:archive_B 表鎖和檢查限制檢查

任何人都知道問題可能是什麼?

在此先感謝

+2

首先,你沒有做同樣的事情。您的第一個查詢將在您的存檔表中的特定日期並寫入另一個表中。然後,你從這張小得多的表格中拉出3列到最終目的地。與您的SSIS方法相比,您可以抓取歸檔表中的每個字段,如果這些字段超過這3列,則必須讀取比所需更多的數據。您還必須計算歸檔表與固定時間點的最大日期。最後,第一個可能不需要考慮網絡延遲。 – billinkc

+0

嗯,數據流應該擊敗SELECT INTO?您可以使用執行SQL任務來獲取MAX(My_date)並將其存儲在變量中,然後在數據流的OLE DB源中使用該變量。 (順便說一句,您的標題應該是「SSIS Data Flow ...」,而不是「SSIS Task Flow ...」。)這只是分隔子查詢。另一件事是檢查從源到目標的箭頭上的元數據。所有的100列都有正確的數據類型嗎?您還可以添加一個[Data Viewer](http://msdn.microsoft.com/zh-cn/library/ms140318.aspx),並隨着數據的流逝觀察數據。 – criticalfix

+0

我以爲你在這兩種情況下都轉移了100多列,而你只是顯示了腳本的縮略版本。如果你只需要列的一個子集,那麼你肯定需要在SSIS出現之前告訴SSIS並且移動千兆字節... – criticalfix

回答

1

的問題是,由於您使用的數據源和數據目的地你在做什麼是拉動所有數據從數據庫中來,然後把它所有的再次插入,而你INSERT語句將其全部包含在數據庫中。改用INSERT語句使用Excute SQL Task。

+0

問題在於他沒有限制SQL中他所在的記錄集。 – Zane

+0

@davesexton我正在使用數據流任務,因爲我正在使用插入的行計數任務用於審計目的 – user2129585

+0

或者您可以在SELECT INTO之後執行SELECT COUNT(),這應該在審計目的時完成相同的操作。 – criticalfix