2013-10-10 16 views
2

我有一個數據流包含調用存儲過程的OLEDB源(通過變量生成的語句)。 在SSMS中,需要8分鐘,但包裝本身需要花費3倍的時間才能完成。 我已將驗證(DelayValidation)設置爲true,因此它在運行時仍會執行此操作。我還在數據流組件中以及在連接管理器中設置了元數據的驗證。 數據流也具有ReadUncommitted。 我不知道在哪裏尋找,如何讓這個運行更快的任何幫助將是偉大的。SSIS預評估階段花費很長時間

+0

你能後的SSIS日誌,說明您認爲有性能問題。 –

+0

軟件包未啓用日誌記錄,但在使用dtexecui運行時,在預執行階段過程需要很長時間。我期望從包裝中完全減少或刪除該步驟,因爲這是瓶頸所在。 – dirtyw0lf

+0

我不知道答案,但發現很多事情要嘗試,例如,當我搜索「ssis預執行階段卡住」。你有沒有對數據庫運行分析器,看看它在這個時間裏正在做什麼?它反對什麼數據庫? –

回答

7

我懷疑真正的問題是在你的存儲過程,但我已經包括了一些基本的SSIS項目,以及設法解決您的問題:

  • 確保連接管理器的OLE DB源都設置toDelayValidation (=真)。
  • 確保ValidateExternalMetadata設置爲false
  • DefaultBufferMaxRows和DefaultBufferSize對應表中的行大小
  • 刪除並重新創建目標組件是SSIS
  • 確保您的存儲過程SET ANSI_NULLS ON
  • 確保您的存儲過程中的SQL命中索引
  • 添加查詢提示OPTION(FAST 10000) - 此提示表示它將選擇一個將優化前10,000行的查詢 - 默認SSIS緩衝區大小

  • 查看您的存儲過程SQL Server parameter sniffing

慢速方式:

create procedure GetOrderForCustomers(@CustID varchar(20)) 
as 
begin 
    select * from orders 
    where customerid = @CustID 
end 

快速的方法:

create procedure GetOrderForCustomersWithoutPS(@CustID varchar(20)) 
as 
begin 
    declare @LocCustID varchar(20) 
    set @LocCustID = @CustID 

    select * from orders 
    where customerid = @LocCustID 
end 
+0

爲什麼你建議跳過驗證?我覺得它很有價值,雖然有時很慢。當然,在編譯時當前不存在表或字段的特定場景之外,您是否看到過這會導致問題? – 2015-12-28 18:21:27

+0

我沒有看到它導致問題,除了它很慢。將ValidateExternalMetadata屬性設置爲False可以比將DelayValidation屬性設置爲True提供更精確的數據流控制。當ValidateExternalMetadata屬性設置爲True(默認值)時,它有助於避免包在使用事務時出現鎖定問題。出於這個原因,您可能希望堅持在任務級別使用DelayValidation,除非您有一些壓倒性的需要在組件級別工作。 – Renegrin

+0

選項(FAST N)對我來說是修復。 – vanlee1987