2015-06-02 89 views
0

在這裏multitheading是問題: 我使用VisualCron運行SQL Server 2008 R2上一個SSIS包。 SSIS包將運行一個查詢,獲取數百萬行並將其輸出到平面文件中。有時,我發現當我運行這個SSIS包時,sql服務器不使用多線程(我可以從活動監視器中得知),這會導致運行時間很長,大約需要20個小時。但是,如果使用多線程,可以在8分鐘內完成。SQL服務器強迫執行SSIS包

有沒有辦法強制SQL Server使用時,它在運行這個SSIS包多線程?

回答

0

有優化您的查詢處理多個同時操作......或至少提高性能的幾個選項。

  1. 在查詢中應用OPTION MAXDOP以應用操作系統可用的最大處理器數量(並行度)。下面列出的是一個例子,這裏有一個更詳細的link

    SELECT名字,姓氏 FROM dbo.Customer OPTION(MAXDOP 1)

  2. 應用NOLOCK的查詢是否有與表中的數據SSIS包操作過程中被更新無關。也就是說,如果不存在關於「髒讀」的問題,這是有效的。請參閱以下link和示例。

    SELECT名字,姓氏 FROM dbo.Customer WITH(NOLOCK)

  3. 回顧這link用於改進查詢性能的最佳實踐。可能還有其他步驟未採用,或者尚未應用的工具可能會極大地幫助提高性能。

+0

你這裏說的是正確的大部分。感謝您的回答。我在底部發布我的解決方案。 –

0

問題越來越清楚。
這與sql如何決定使用串行執行計劃或並行執行計劃有關。這是優化者的工作。事實證明,我在VisualCron中有兩個計劃運行的任務,它們都將運行相同的大查詢。不同的是他們會得到不同的輸入參數。
第一個得到的參數不會處理太多的數據。
第二個獲取處理大量數據的參數。

我假設SQL優化器首先看到提交的查詢,查詢不會得到太多的數據,因此它決定使用串行計劃。

我猜這個相同的查詢計劃被緩存,所以當它檢查第二提交的查詢,優化器可能會檢查高速緩存,看看是否有過去評價此查詢計劃的存在。那麼,如果它存在,它就會使用它。 這就是爲什麼它仍然選擇使用第二個查詢的序列計劃。

我改變了兩個任務的順序(我執行的是先處理更多數據的處理,然後是處理更少數據的處理),它可以工作,現在它們都使用並行計劃。 (您可能需要重新啓動實例,以清除緩存的執行計劃)

優化程序的工作原理仍然是我的假設。

其他人的帖子,解釋如何優化正在發揮重要作用,在這裏

http://sqlblog.com/blogs/paul_white/archive/2011/12/23/forcing-a-parallel-query-execution-plan.aspx