作为我之前关于对 Sharepoint 站点进行性能故障排除的问题的后续,我想知道是否可以对 CXPACKET 等待做些什么。
我知道下意识的解决方案是通过将 MAXDOP 设置为 1 来关闭所有并行性 - 听起来是个坏主意。但另一个想法是在并行性开始之前提高成本阈值。执行计划成本的默认值 5 相当低。
所以我想知道是否已经编写了一个查询,可以找到执行计划成本最高的查询(我知道您可以找到执行时间最长的查询等等 - 但是执行计划成本是否可以在某处检索,也是?),这也会告诉我这样的查询是否已并行执行。
有没有人手头有这样的脚本,或者可以指出相关 DMV、DMF 或其他系统目录视图的方向来找出这个?
CXPACKET
从来都不是原因;它受到了所有的责备,但它总是其他事情的症状。您需要在行动中捕捉这些查询并弄清楚“其他东西”是什么。它可能因查询而异,并且完全关闭并行性 - 正如您所建议的那样 - 在大多数情况下是不必要的过度杀伤。但它通常是最少的工作量,这就是为什么它是如此普遍的“修复”。如果您可以获得似乎导致高 CXPACKET 等待的查询的实际计划,请将其加载到SentryOne Plan Explorer中。这通常是有原因的。我们展示了哪些并行操作导致了线程倾斜,您可以轻松地将其与关闭的估计相关联(我们突出显示估计至少偏离某个阈值的操作)。通常,潜在的问题是非常糟糕/过时(或不可用)的统计数据。
不幸的是,您会在 sys.dm_exec_cached_plans 中找到估计的计划。他们不会告诉您计划在实际使用时是否并行,因为实际计划不是缓存的内容。在某些情况下,您希望看到同一查询的串行和并行计划;这不是 SQL Server 处理可能在运行时并行的并行计划情况的方式。(这里有很多关于这方面的信息。)
如果您希望查看正在运行的查询的实际执行计划。
首先,然后将结果输入到此查询中。
这将向您显示 sql 用于该查询的实际执行计划。您可以使用该执行计划来查看您正在等待哪个线程。
我还发现关闭超线程大大减少了我的 CXpacket 等待时间。
希望有帮助。
Aaron 的上述回答是正确的。
我想补充一点,如果您还没有使用SQL Performance Dashboard Reports和内置的Data Collector,那么您应该开始。
您还可以使用以下查询,并根据需要对其进行修改:
在我之前的经验中,并行的成本阈值无助于减少 CXPACKET。
由于不正确的统计数据会导致高
CXPACKET
等待,从而导致偏斜并行。以下是我用来查找包含CXPacket和“其他等待”的会话的 SQL(请参阅下面的图表)。
SQL
大型扫描也可能是根本原因的一部分。当我从上述查询中检查执行计划时,我在我的数据库中发现了一个这样的扫描。执行计划中还缺少索引建议。