我在 SQL Server 2016 中有一个巨大的查询——当我运行一个记录子集的查询时,它在 15 分钟内完成。当我将其推断为记录总数时,它应该在 1 小时内完成。但3小时后仍未完成。当我检查 master.sys.sysprocesses
时有一个 CXPACKET 等待 10293331 等待时间
SELECT waittime, waittype, lastwaittype, open_tran, cpu, physical_io, [sid], loginame, [sql_handle]
FROM master.sys.sysprocesses WHERE SPID=58
注意:我执行execsp_Who2
得到具体的SPID=58
从如何使用 sp_WhoIsActive 查找慢速 SQL Server 查询
@get_task_info = 2 – 如果一个查询是并行的并且你正在对 CXPACKET 等待进行故障排除,你可以找出查询中的每个任务正在等待什么。
我用@get_task_info = 2 执行了 sp_WhoIsActive。
wait_info
给出以下内容:
(5x: 68/168850/635541ms)CXPACKET:15, (3x: 3/16/32ms)CXPACKET:7, (1x: 10207374ms)CXPACKET:1
如何从这些信息中判断出每个任务在等待什么?
更新
这个问题更多的是关于找到一种“方法”来找出等待资源(使用 sp_WhoIsActive 或类似的),而不是通过添加 MAXDOP 或分析执行计划来实际解决当前的性能问题。
如果您正在寻找这些数字的含义,请查看sp_whoisactive 文档。
从 Adam Machanic 的CXPACKET node identifier 页面,您可以在输出中看到这一行:
意味着有
此处记录了由斜杠分隔的 3 个数字:
的输出
@get_task_info = 2
告诉你希望这能为您提供足够的信息,让您能够找到查询的哪一部分卡在了这些并行等待上,以便您可以进一步调查。