CXPACKET被挂起和NULL等待类型。

我在这篇文章中运行了查询。

http://sqlity.net/en/708/why-cxpacket-waits-are-not-your-performance-problem/

查看我的线程在等待什么,关于一个带有CXPACKET等待类型的挂起查询。
然而,对于所讨论的SPID,正在运行的线程显示为NULL等待类型,而其他每个线程都处于挂起状态,并且等待类型为CXPACKET。
我原本期望其中一个线程具有与CXPACKET不同的等待类型,有人能解释一下这种情况发生了什么吗?
谢谢。
2个回答

你所看到的是具有CXPACKET等待的线程实际上已经完成了它们需要做的工作,现在正在等待其他活动线程(等待类型为NULL的线程)完成。

Brent O使用了一个很好的比喻来解释这一点。老师把一堆不同的纸堆发给学生,并让他们在上面找到一个单词。我们需要考虑以下几点:1)纸堆的大小可能不同;2)不同的学生读书速度快慢不同;3)一个学生可能在第一页上找到单词一次,而下一个学生可能在3000页中找到400次。

当处理并行性时,你所看到的是一种自然且预期的行为,一些线程比其他线程更快完成,并被迫等待其他线程完成,重新收集所有线程并给出输出。

http://www.brentozar.com/archive/2013/08/what-is-the-cxpacket-wait-type-and-how-do-you-reduce-it/


我明白了,但我还是希望在执行某些任务的线程中看到一种等待类型的出现。另外,如何平衡工作负载才是最好的方式呢?只需确保你有一个良好的索引策略吗? - Tom
嗯,想一想。没有等待类型,因为那个线程实际上在做某些事情,它不是在等待任何东西,它正在工作。:) 记住,CXPACKET 等待并不一定是坏事。现在,如果它们占总等待时间的50%以上,那么你可能需要考虑调整 MAXDOP 和 Cost Threshold for parallelism。首要原则是不要修复不是问题的东西。那篇文章可以帮助你确定这些设置的起点。这是一个非常试错的过程,我花了两周时间来调整我们的设置。我们使用 CTP=40,MAXDOP=4。 - Kris Gruttemeyer
你希望找到合适的平衡点,这样你的大型查询可以得到分散和并行处理,而你的小型查询则保持单线程,并为大型查询留下更多的线程。 - Kris Gruttemeyer
那篇文章(Sebastian的)很好,但更简单的方法是使用Adam Machanic的sp_WhoIsActive @get_task_info = 2。这个工具能展示每个并行查询中的个别任务正在等待什么 - 换句话说,在课堂比喻中,就是慢学生在做什么。 - Brent Ozar

CXPACKET对于年轻的数据库管理员来说一直是一个令人困惑的等待类型,一些可预测的错误反应是可以预料的。CXPACKET等待类型有多个方面,我在SQL Server中解决CXPACKET等待类型问题文章中尽力提出了大部分高CXPACKET的原因,并解释了CXPACKET的背景,因为正确理解SQL Server中的并行性是理解的关键。

所以对于那些不想深入了解的人,我将在这里发布文章的摘要(但我强烈建议阅读完整的CXPACKET等待类型文章以获取完整信息):

不要将MAXDOP设置为1,因为这从来都不是解决方案。
调查查询和CXPACKET的历史记录,以了解并确定它是否只发生了一两次,因为它可能只是系统中通常正常工作的异常情况。
检查查询使用的表的索引和统计信息,并确保它们是最新的。
检查并确保所使用的成本阈值与您的系统相适应。
检查CXPACKET是否伴随着LATCH_XX(可能还有PAGEIOLATCH_XX或SOS_SCHEDULER_YIELD)。如果是这种情况,则应降低MAXDOP值以适应您的硬件。
检查CXPACKET是否伴随着LCK_M_XX(通常伴随IO_COMPLETION和ASYNC_IO_COMPLETION)。如果是这种情况,则并行性不是瓶颈。通过排除等待统计数据来找到问题和解决方案的根本原因。