Sql-Server
‘Max Degree of Parallelism’ = 1 的伺服器範圍設置能否導致 Brent Ozar 的 sp_BlitzCache 將執行計劃標記為“強制序列化”?
我正在使用 Brent Ozar 的 sp_BlitzCache 儲存過程,並試圖確定它報告的原因:
“您計劃中的某些內容強制進行串列查詢。如果這不是設計使然,則需要進一步調查。”
經過調查,我發現伺服器配置已設置:
'Max Degree of Parallelism = 1'
(這是我正確配置的洗衣清單。這是無知的日子。)
這是設置布倫特報告強制序列化的原因嗎?
是的,這會導致這個問題。
如果沒有什麼反對它(其他服務,vms 等),則使用 cpu 的數量作為值,並使用超執行緒作為所有虛擬 cpu 的數量。
有關更多資訊和建議,您可以查看
補充一點,該檢查將找到任何原因導致查詢被迫執行單執行緒:
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)中被跳過,但現在它只會在任何地方發出警告。