天天看點

第12/24周 并行執行計劃

在這一期的性能調優教育訓練裡,我想詳細講解下SQL Server裡的并行執行計劃(Parallel Execution Plans) 。執行一個有并行執行計劃的查詢,意味着SQL Server從執行計劃裡進行必須的運算符需要使用多線程。首先我會介紹下并行執行計劃裡最常用的運算符,然後我們來分析下SQL Server是如何決定是否要使用并行執行計劃。

并行運算符(Parallel Operators)

對于并行執行計劃最常見的誤解就是多線程隻用于整個執行計劃。這是錯誤的,因為SQL Server可以配置設定多個工作線程給所有可并行(parallelism-aware)運算符。這就意味者一個大型的并行計劃可以消耗大量的線程。SQL Server在并行計劃裡區分2類運算符:可并行(parallelism-aware)運算符,和稱為交換運算符(Exchange Operators):

  • 很多傳統的運算符可以使用多線程來進行它們的工作,它們是可并行(parallelism-aware)運算符:索引掃描(Index Scan),索引查找(Index Seek),嵌套循環(Nested Loop),哈希連接配接(Hash Join),排序(Sort)等。
  • 交換運算符(Exchange Operators)是在并行執行計劃裡,用來分發和合并多線程之間的行。

SQL Server使用下列3個交換運算符:

  • Distribute Streams: 在并行計劃中,從一個單線程裡區域轉變為多線程區域(接收記錄的單個輸入流,并生成多個輸出流。)。
  • Repartition Streams: 線上程間重新配置設定行(例如,目前一個運算符是并行哈希連接配接)(處理多個流并生成多個記錄流。)。
  • Gather Streams:在并行計劃中,從多線程區域轉變為單線程區域(處理幾個輸入流并通過組合這幾個輸入流生成單個記錄輸出流。)。

當你閱讀并行執行計劃時,你總會看到2種運算符的結合。每個執行計劃必須生成一個單線程的結果,是以在并行執行計劃的結尾,你總能看到Gather Streams運算符。

第12/24周 并行執行計劃

查詢優化器是否生成一個并行執行計劃也取決于你使用的查詢結構是否會阻止并行計劃,例如:

  • T-SQL 語句和SQL公共語言運作庫的自定義函數(SQLCLR UDFs);
  • 内建函數,像OBJECT_ID(), ERROR_NUMBER(), @@TRANCOUNT等;

在并行計劃裡,也有很多查詢結構會強制串行區域(這部分操作會使用并行計劃):

  • 系統表掃描(System Table Scans)
  • 序列函數(Sequence Functions)
  • 向後掃描(Backward Scans)
  • 遞歸查詢(Recursive Queries)
  • 表值函數(TVFs)
  • TOP

在你的并行計劃裡,串行區域越少,你的查詢越快。當你下次寫你的查詢時,好好考慮這點。

什麼時候使用并行(When to go parallel?)

每個執行計劃都會被SQL Server配置設定一個成本因素(Cost Factor) 。成本因素就是用來告訴SQL Server這個執行計劃有多貴的簡單數字。這個數字越大,執行計劃運作的關聯成本就越高。

SQL Server有一個稱為并行開銷閥值(cost threshold for parallelism)的配置選項,用來定義成本因素,在哪個點查詢優化會考慮使用并行計劃。預設這個配置選項是5,也就說查詢高于這個成本值,隻要并行計劃可行,就會使用并行計劃。

當并行計劃被查詢優化器編譯好後,最大并行度(Max Degree of parallelism(MAXDOP))選項定義對執行計劃中的每個并行運算符可用線程數。我剛才提過,并行執行計劃裡的每個運算符都可以用多線程運作,而不是整個執行計劃。當然在并行執行計劃裡,線程可以被前一個運算符共享和重用。可以通過伺服器屬性->進階->并行配置這些屬性:

第12/24周 并行執行計劃

預設最大并行度(MAXDOP)選項值是0,是以SQL Server會預設将并行查詢穿過所有配置設定給SQL Server的CPU核心。當你使用NUMA(Non Uniform Memory Access)系統時,這個會導緻性能問題。最佳實踐是限制MAXDOP選項值,在NUMA節點裡的核心數(包括超線程的核心數)範圍内。這樣就可以保證SQL Server的并行計劃呆在NUMA節點内。

小結

這一期的性能調優教育訓練裡我講解了SQL Server裡的并行執行計劃,你學到了在并行執行計劃裡涉及到的各種運算符,還有在SQL Server裡你如何配置并行度。如果你想對并行計劃有更深入的了解,可以看下…………(此次内容待完善)。

看完這篇文章,性能調優教育訓練的第3個月就已經結束了,在下一個月我會講解下SQL Server裡的統計資訊。請繼續關注!

圍觀PPT:

0812_12_并行執行計劃.rar

注:此文章為

WoodyTu

學習MS SQL技術,收集整理相關文檔撰寫,歡迎轉載,請在文章頁面明顯位置給出此文連結!

若您覺得這篇文章還不錯請點選下右下角的推薦,有了您的支援才能激發作者更大的寫作熱情,非常感謝!

繼續閱讀