2013-02-25 80 views
0

我有超過百萬條記錄的表。SSIS OLEDB SQL命令執行緩慢

  1. 當我執行我的SSMS查詢約需1:24不到2分鐘,確保在任何時間點,並返回60萬左右的記錄。
  2. SSIS花費了幾個小時的時間,事實上我只能導出一次。

下面是示例SQL:

SELECT distinct 
A.Col1, A.Col2, A.Col3, A.Col4, A.Col5, A.Col6, A.Col7, B.Col3 
FROM tblA A 
inner join tblB B on A.Col1 = B.col1 and 
A.Col2 = 'AB' AND A.Col3 Not In ('A','B','C') AND 
A.Col3 In ('FPC','FPE','PRN','SUB','RVW','FPO','FEV','PRM') 

注:索引做存在在選擇SQL查詢中的所有列(和where子句中提到的列)。

在SSIS中,

  1. 我有控制流數據流任務。
  2. OleDB Source with SQL query command。
  3. OleDB目的地tbl。

什麼可能導致SSIS延遲?

+0

SSIS執行是否與源服務器和目標服務器在同一臺計算機上運行,​​或者是通過網絡進行的部分操作? – RBarryYoung 2013-02-25 22:55:46

+0

目標服務器正在執行或在網絡上,但執行sql需要很長時間(SSIS執行主機與源相同的機器)。 – user1810575 2013-02-25 23:05:57

+0

有什麼建議?我不能在這裏使用Execute sql任務,因爲源和目標服務器/ db是不同的。 – user1810575 2013-02-25 23:34:55

回答

1

您的問題很可能與您的OLE DB目的地和它可以接受行的速率有關。您可以通過在刪除OLE DB目標文件的情況下測試一個包的副本來確認這一點。

假設是這種情況,最常見的原因是沒有使用OLE DB Destination中的「快速加載」選項傳遞到SQL Server。

+0

這樣做。謝謝!! – user1810575 2013-02-26 15:47:38

1

根據我的經驗,這可能是兩兩件事之一:

  1. 這可能是什麼被稱爲參數嗅探。這僅僅意味着它有時會將一個錯誤的(慢)查詢計劃綁定到query +參數,並且由於緩存,這個錯誤的計劃可能會變得「卡住」並不斷重用於特定的應用程序或用途。檢測這種情況的方法是使用SQL事件探查器爲您的SSIS任務的查詢捕獲查詢計劃,然後將其與快速執行的SSMS版本的查詢計劃進行比較。如果查詢計劃顯着不同,那麼你可能有一個參數嗅探問題。

  2. 但是,對於SSIS有一個更常見的問題(我的評論/問題和Mike Honey的回答中提到):因爲SSIS使用管道架構,所有你需要的是鏈中一個緩慢的組件,整個管道。慢組件的一個常見原因是沒有使用數據流任務的最佳任務設置。

使用「快速加載」的是一種可能性,但以我的經驗,還有另外一個設置是更常見的流水線在網絡上的一個問題,那就是「DefaultBufferMaxRows」。默認值爲10,000,對於網絡連接,我總是發現這種方式太高,在這種情況下,可能應該在100到1000之間。

這是控制流中目標DFT(數據流任務)的一個屬性,因此要更改它只是在控制流視圖中選擇該任務的圖標。您應該在屬性窗格(在「Misc」下)看到DefaultBufferMaxRows。您也可以按比例降低「DefaultBufferSize」。