You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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]21002024-06-13 13:39:04.4100000
[dbo][MyTable_2][_WA_Sys_00000015_4B4D17CD]01002024-06-13 12:06:33.1700000

内容的提问来源于stack exchange,提问作者MegaCalkins

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 14:19:57