Sql-Server

‘Max Degree of Parallelism’ = 1 的伺服器範圍設置能否導致 Brent Ozar 的 sp_BlitzCache 將執行計劃標記為“強制序列化”?

  • July 12, 2021

我正在使用 Brent Ozar 的 sp_BlitzCache 儲存過程,並試圖確定它報告的原因:

“您計劃中的某些內容強制進行串列查詢。如果這不是設計使然,則需要進一步調查。”

經過調查,我發現伺服器配置已設置:

'Max Degree of Parallelism = 1' 

(這是我正確配置的洗衣清單。這是無知的日子。)

這是設置布倫特報告強制序列化的原因嗎?

在此處輸入圖像描述

是的,這會導致這個問題。

如果沒有什麼反對它(其他服務,vms 等),則使用 cpu 的數量作為值,並使用超執行緒作為所有虛擬 cpu 的數量。

有關更多資訊和建議,您可以查看

https://docs.microsoft.com/en-US/sql/database-engine/configure-windows/configure-the-max-degree-of-parallelism-server-configuration-option?view=sql-server-ver15

補充一點,該檢查將找到任何原因導致查詢被迫執行單執行緒:

WITH XMLNAMESPACES('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS p)
UPDATE  ##BlitzCacheProcs
   SET is_forced_serial = 1
FROM    #query_plan qp
WHERE   qp.SqlHandle = ##BlitzCacheProcs.SqlHandle
AND     SPID = @@SPID
AND     query_plan.exist('/p:QueryPlan/@NonParallelPlanReason') = 1
AND     (##BlitzCacheProcs.is_parallel = 0 
          OR ##BlitzCacheProcs.is_parallel IS NULL)
OPTION (RECOMPILE);

有一次,Microsoft 記錄了一個查詢無法並行的原因列表,以及查詢計劃 XML 中的表示方式,但在實踐中(Azure SQL DB 中最近發生了一些變化),原因列表非常有限特地冒泡。

大多數情況下,你得到的所有NonParallelPlanReason都是CouldNotGenerateValidParallelPlan。這就是為什麼我寫了檢查以找到任何通用的原因。

它可能更具表現力,或者在並行受限的版本(如 Express Edition)中被跳過,但現在它只會在任何地方發出警告。

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