Sql-Server

MAXDOP = 1,查詢提示和並行成本門檻值

  • June 8, 2019

如果實例已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 值來決定是否實際並行?

簡單的回答:的。

細節

這裡有幾件單獨的事情,分開很重要:

  1. 查詢可用有效最大並行度是多少?

對此的貢獻者是(大致按重要性排序):

平行度表

  1. 查詢計劃會使用並行性嗎?

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

引用自:https://dba.stackexchange.com/questions/215548