如何从SQL Server缓存执行计划提取指定QueryPlanHash的所用统计信息
从SQL Server缓存执行计划提取指定查询计划哈希的统计信息
环境与目标
基于SQL Server 2016/2019,针对指定查询计划哈希 @QueryPlanHash BINARY(8) = 0x397CEDB37FA0E1D2,从缓存中的执行计划XML里提取以下统计信息:
- 架构(Schema)
- 表(Table)
- 统计对象(Statistics)
- 修改次数(ModificationCount)
- 采样百分比(SamplingPercent)
- 最后更新时间(LastUpdate)
执行计划XML中的统计信息片段
<OptimizerStatsUsage> <StatisticsInfo Database="[MyDatabaseName]" Schema="[dbo]" Table="[MyTable_1]" Statistics="[IX_MyTable_1_Field1]" ModificationCount="2" SamplingPercent="100" LastUpdate="2024-06-13T13:39:04.41" /> <StatisticsInfo Database="[MyDatabaseName]" Schema="[dbo]" Table="[MyTable_2]" Statistics="[_WA_Sys_00000015_4B4D17CD]" ModificationCount="0" SamplingPercent="100" LastUpdate="2024-06-13T12:06:33.17" /> </OptimizerStatsUsage>
提取信息的SQL脚本
使用以下语句筛选目标查询计划并解析XML提取所需字段:
DECLARE @QueryPlanHash BINARY(8) = 0x397CEDB37FA0E1D2; SELECT stats_info.value('@Schema', 'NVARCHAR(128)') AS [架构], stats_info.value('@Table', 'NVARCHAR(128)') AS [表], stats_info.value('@Statistics', 'NVARCHAR(128)') AS [统计对象], stats_info.value('@ModificationCount', 'INT') AS [修改次数], stats_info.value('@SamplingPercent', 'INT') AS [采样百分比], stats_info.value('@LastUpdate', 'DATETIME2') AS [最后更新时间] FROM sys.dm_exec_cached_plans cp CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) qp CROSS APPLY qp.query_plan.nodes('/ShowPlanXML/BatchSequence/Batch/Statements/StmtSimple/QueryPlan/OptimizerStatsUsage/StatisticsInfo') AS stats(stats_info) WHERE cp.query_plan_hash = @QueryPlanHash;
示例提取结果
| 架构 | 表 | 统计对象 | 修改次数 | 采样百分比 | 最后更新时间 |
|---|---|---|---|---|---|
| [dbo] | [MyTable_1] | [IX_MyTable_1_Field1] | 2 | 100 | 2024-06-13 13:39:04.4100000 |
| [dbo] | [MyTable_2] | [_WA_Sys_00000015_4B4D17CD] | 0 | 100 | 2024-06-13 12:06:33.1700000 |
内容的提问来源于stack exchange,提问作者MegaCalkins
相关产品推荐
相关产品推荐

