并行执行计划
并行運算符(Parallel Operators)
對于并行執(zhí)行計劃最常見的誤解就是多線程只用于整個執(zhí)行計劃。這是錯誤的,因為SQL Server可以分配多個工作線程給所有可并行(parallelism-aware)運算符。這就意味者一個大型的并行計劃可以消耗大量的線程。SQL Server在并行計劃里區(qū)分2類運算符:可并行(parallelism-aware)運算符,和稱為交換運算符(Exchange Operators):
- 很多傳統(tǒng)的運算符可以使用多線程來進(jìn)行它們的工作,它們是可并行(parallelism-aware)運算符:索引掃描(Index Scan),索引查找(Index Seek),嵌套循環(huán)(Nested Loop),哈希連接(Hash Join),排序(Sort)等。
- 交換運算符(Exchange Operators)是在并行執(zhí)行計劃里,用來分發(fā)和合并多線程之間的行。
SQL Server使用下列3個交換運算符:
- Distribute Streams: 在并行計劃中,從一個單線程里區(qū)域轉(zhuǎn)變?yōu)槎嗑€程區(qū)域(接收記錄的單個輸入流,并生成多個輸出流。)。
- Repartition Streams: 在線程間重新分配行(例如,當(dāng)前一個運算符是并行哈希連接)(處理多個流并生成多個記錄流。)。
- Gather Streams:在并行計劃中,從多線程區(qū)域轉(zhuǎn)變?yōu)閱尉€程區(qū)域(處理幾個輸入流并通過組合這幾個輸入流生成單個記錄輸出流。)。
當(dāng)你閱讀并行執(zhí)行計劃時,你總會看到2種運算符的結(jié)合。每個執(zhí)行計劃必須生成一個單線程的結(jié)果,因此在并行執(zhí)行計劃的結(jié)尾,你總能看到Gather Streams運算符。
查詢優(yōu)化器是否生成一個并行執(zhí)行計劃也取決于你使用的查詢結(jié)構(gòu)是否會阻止并行計劃,例如:
- T-SQL 語句和SQL公共語言運行庫的自定義函數(shù)(SQLCLR UDFs);
- 內(nèi)建函數(shù),像OBJECT_ID(), ERROR_NUMBER(), @@TRANCOUNT等;
在并行計劃里,也有很多查詢結(jié)構(gòu)會強制串行區(qū)域(這部分操作會使用并行計劃):
- 系統(tǒng)表掃描(System Table Scans)
- 序列函數(shù)(Sequence Functions)
- 向后掃描(Backward Scans)
- 遞歸查詢(Recursive Queries)
- 表值函數(shù)(TVFs)
- TOP
在你的并行計劃里,串行區(qū)域越少,你的查詢越快。當(dāng)你下次寫你的查詢時,好好考慮這點。
什么時候使用并行(When to go parallel?)
每個執(zhí)行計劃都會被SQL Server分配一個成本因素(Cost Factor)?。成本因素就是用來告訴SQL Server這個執(zhí)行計劃有多貴的簡單數(shù)字。這個數(shù)字越大,執(zhí)行計劃運行的關(guān)聯(lián)成本就越高。
SQL Server有一個稱為并行開銷閥值(cost threshold for parallelism)的配置選項,用來定義成本因素,在哪個點查詢優(yōu)化會考慮使用并行計劃。默認(rèn)這個配置選項是5,也就說查詢高于這個成本值,只要并行計劃可行,就會使用并行計劃。
當(dāng)并行計劃被查詢優(yōu)化器編譯好后,最大并行度(Max Degree of parallelism(MAXDOP))選項定義對執(zhí)行計劃中的每個并行運算符可用線程數(shù)。我剛才提過,并行執(zhí)行計劃里的每個運算符都可以用多線程運行,而不是整個執(zhí)行計劃。當(dāng)然在并行執(zhí)行計劃里,線程可以被前一個運算符共享和重用。可以通過服務(wù)器屬性->高級->并行配置這些屬性:
默認(rèn)最大并行度(MAXDOP)選項值是0,因此SQL Server會默認(rèn)將并行查詢穿過所有分配給SQL Server的CPU內(nèi)核。當(dāng)你使用NUMA(Non Uniform Memory Access)系統(tǒng)時,這個會導(dǎo)致性能問題。最佳實踐是限制MAXDOP選項值,在NUMA節(jié)點里的核心數(shù)(包括超線程的核心數(shù))范圍內(nèi)。這樣就可以保證SQL Server的并行計劃呆在NUMA節(jié)點內(nèi)。
小結(jié)
這一期的性能調(diào)優(yōu)培訓(xùn)里我講解了SQL Server里的并行執(zhí)行計劃,你學(xué)到了在并行執(zhí)行計劃里涉及到的各種運算符,還有在SQL Server里你如何配置并行度。如果你想對并行計劃有更深入的了解,可以看下…………(此次內(nèi)容待完善)。
本文轉(zhuǎn)自Woodytu博客園博客,原文鏈接:http://www.cnblogs.com/woodytu/p/4584277.html,如需轉(zhuǎn)載請自行聯(lián)系原作者
總結(jié)
- 上一篇: 开发中使用UEditor编辑器的注意事项
- 下一篇: JS组件系列——开源免费图表组件:Cha