最近,我一直在 DMV 上针对我们的生产系统运行查询,以查询计划缓存。特别是,这里是查询的 from 子句:
FROM sys.dm_exec_cached_plans AS cp
CROSS APPLY sys.dm_exec_query_plan(plan_handle) AS qp
CROSS APPLY query_plan.nodes('/ShowPlanXML/BatchSequence/Batch/Statements/StmtSimple') AS batch(stmt)
CROSS APPLY stmt.nodes('.//IndexScan/Object[@Index=sql:variable("@IndexName")]') AS idx(obj)
Run Code Online (Sandbox Code Playgroud)
dm_exec_cached_plans 中大约有 28k 行。
当我这样做时,它会触发 PLE 降低非常低和非常高的磁盘 IO 和延迟(读/写停顿)的警报。
这令人惊讶,因为我从未阅读或经历过与针对 DMV 运行即席查询的性能问题相关的任何内容。该服务器具有 24 个内核、64GB RAM 和 SSD。我知道总有比这更多的东西,但我很难相信这些查询会导致这样的问题。
谁能解释一下为什么会发生这种情况?我很高兴提供有关我们配置的更多信息,但我也希望有一个简单的解释。
我正在尝试使用扩展事件来跟踪从未使用事件配对作为目标完成的查询。(请参阅我几天前问的这个问题)。事件配对目标应该让我找到开始但从未完成的查询。
我的新问题是我需要知道发生此事件时服务器上还发生了什么。例如,每当我发现查询未在 20 秒以上完成时,我都想执行一个存储过程,如 sp_who、sp_who2、sp_WhoIsActive 等。这可能吗?