MAXDOP = 1,查詢提示和並行成本門檻值
如果實例已
MAXDOP
設置為 1,並且查詢提示用於允許特定查詢並行,SQL 是否仍使用 Cost Threshold For Parallelism 值來決定是否實際並行?儘管此連結表明如果 CTFP 為 1,則忽略此特定資訊,但我無法探勘此特定資訊。如果
MAXDOP
沒有查詢提示,這是有道理的,因為無論成本如何,當MAXDOP
為 1 時,任何請求都不會並行。誰能讓我知道這兩個請求的預期行為是什麼?
範例 1:
Instance Maxdop: 1 CTFP: 50 Query hint: Maxdop=2 Query cost: 30
範例 2:
Instance Maxdop: 1 CTFP: 50 Query hint: Maxdop=2 Query cost: 70
如果實例已
MAXDOP
設置為 1,並且查詢提示用於允許特定查詢並行,SQL 是否仍使用 Cost Threshold For Parallelism 值來決定是否實際並行?簡單的回答:是的。
細節
這裡有幾件單獨的事情,分開很重要:
- 查詢可用的有效最大並行度是多少?
對此的貢獻者是(大致按重要性排序):
- 資源調控器
MAX_DOP
設置- 查詢提示
MAXDOP
設置max degree of parallelism
實例配置選項詳細資訊在伺服器的“最大並行度”設置、資源管理器的 MAX_DOP 和查詢提示 MAXDOP 中進行了說明——SQL Server 應該使用哪一個?作者:Jack Li,Microsoft SQL Server 客戶服務和支持高級升級工程師。下表是從該連結複製的:
- 查詢計劃會使用並行性嗎?
SQL Server 查詢優化器*總是首先找到串列計劃**.
那麼,如果:
- 進一步優化是合理的;和
- 最佳串列計劃的成本超過
cost threshold for parallelism
配置值…優化器將嘗試找到一個並行計劃。
那麼,如果:
- 找到並行計劃(即是可能的);和
- 並行計劃的成本低於最佳串列計劃
…將製定平行計劃。
**注意:**唯一
cost threshold for parallelism
影響優化器是否尋找並行計劃。一旦記憶體了並行計劃,無論 CTFP 設置如何,它都會在重用時使用並行性(只要執行緒可用)執行。例子
對於這兩個範例,使用實例 maxdop 1 和查詢提示 maxdop 2,有效的可用 DOP為 2。如果選擇並行計劃,它將使用 DOP 2。
範例 1
給定 CTFP 為 50 且找到的最便宜的串列計劃成本為 30,SQL Server不會嘗試尋找並行計劃。將產生一個系列計劃。
範例 2
給定 CTFP 為 50 且發現成本最低的串列計劃為 70,SQL Server 將嘗試找到並行計劃。如果此計劃(如果找到)的成本低於 70(串列計劃成本),則將生成並行計劃。
查詢優化的最終結果始終是單個記憶體計劃:串列或併行。優化器僅在search0 (TP) 和search1 (QP) 階段找到串列計劃。
然後它可以(如所描述的)重新執行search1並要求生成一個並行計劃。然後根據迄今為止最佳的整體計劃成本在串列和並行之間做出選擇。如果優化繼續進行到search2(完全優化),則該選擇具有約束力。優化的每個階段都會考慮許多備選方案,但一個階段的輸出始終是單個最佳計劃,可以是串列的,也可以是並行的。
我在 Myth 中寫過其中的一些內容:SQL Server Caches a Serial Plan with each Parallel Plan