我有一个存在性能问题的大型查询。我想在实时查询统计模式下运行它,但我看到的不是执行计划,而是“等待查询计划”。
在 sys.dm_os_waiting_tasks 中,我看到会话使用 wait_type CXPACKET、CXCONSUMER、HTDELETE 自行阻塞。
同时,我可以简单地构建估计的执行计划,没有任何问题。
请告知我可以采取哪些步骤来解决性能问题。
我有一个存在性能问题的大型查询。我想在实时查询统计模式下运行它,但我看到的不是执行计划,而是“等待查询计划”。
在 sys.dm_os_waiting_tasks 中,我看到会话使用 wait_type CXPACKET、CXCONSUMER、HTDELETE 自行阻塞。
同时,我可以简单地构建估计的执行计划,没有任何问题。
请告知我可以采取哪些步骤来解决性能问题。
我发现SSMS有时不能及时显示计划。
在这些情况下,我只需转到另一个窗口并运行
获取实时计划。
dm_exec_query_statistics_xml
这与您仅获得实时查询统计信息的快照而不是自动更新的计划的体验不同,但如果您想要另一个快照,您可以重新运行查询。此外,这还需要更高的权限,而不仅仅是
SHOWPLAN
同意 Martin 的观点,这是 SSMS 中的一个已知问题,即实时查询计划的渲染可能不可靠。
在计划执行时查看计划快照的其他方法是使用:
sp_WhoIsActive
- 可以用以下命令执行EXEC sp_WhoIsActive @get_plans = 1
或者
急救人员套件-可以使用以下命令执行
EXEC sp_BlitzWho @GetLiveQueryPlan = 1
他们可能都只是调用马丁在幕后提到的系统函数。
无论您使用哪种方法查看快照,您都应该等待一小段时间并查看另一个快照,然后比较两个快照以查看哪个操作挂起。看到这一点的一种方法是找到实际行数仍在增长的操作(并且可能其左侧的操作仍将有 0 个实际行数在等待)。这将有助于突出查询计划中的性能问题。