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 中最近发生了一些变化),原因列表非常有限特地冒泡。
补充一点,该检查将找到任何原因导致查询被迫运行单线程:
有一次,Microsoft 记录了一个查询无法并行的原因列表,以及查询计划 XML 中的表示方式,但在实践中(Azure SQL DB 中最近发生了一些变化),原因列表非常有限特地冒泡。
大多数情况下,你得到的所有NonParallelPlanReason都是CouldNotGenerateValidParallelPlan。这就是为什么我写了检查以找到任何通用的原因。
它可能更具表现力,或者在并行受限的版本(如 Express Edition)中被跳过,但现在它只会在任何地方发出警告。
是的,这会导致这个问题。
如果没有什么反对它(其他服务,vms 等),则使用 cpu 的数量作为值,并使用超线程作为所有虚拟 cpu 的数量。
有关更多信息和建议,您可以查看
https://learn.microsoft.com/en-US/sql/database-engine/configure-windows/configure-the-max-degree-of-parallelism-server-configuration-option?view=sql-server-ver15