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

SQL Server存储过程语句未出现在sys.dm_exec_query_stats的原因排查

存储过程语句在sys.dm_exec_query_stats中不显示的排查问题

我多年来一直用以下查询衡量存储过程性能:

select top 100
    object_name(txt.objectid, txt.[dbid]) as ObjectName, 
    t1.Execution_Count,
    (t1.Total_Physical_Reads / t1.Execution_Count) as AvgPhysReads,  
    (t1.Total_Logical_Reads / t1.Execution_Count) as AvgLogReads,
    (t1.Total_Logical_Writes / t1.Execution_Count) as AvgWrites, 
    (t1.Total_Spills / t1.Execution_Count) as AvgSpills,
    (t1.Total_Worker_Time / (t1.Execution_Count * 1000.0)) as AvgCPU, 
    (t1.Total_Elapsed_Time / (t1.Execution_Count * 1000.0)) as AvgDuration,
    replace(replace(substring(txt.[text], (t1.statement_start_offset / 2) + 1, 250), char(13), ' '), char(10), ' ') as SQL_Statement
from 
    sys.dm_exec_query_stats as t1
cross apply 
    sys.dm_exec_sql_text(t1.[sql_handle]) as txt
where 
    (object_name( txt.objectid, txt.[dbid] ) = '[stored proc name]')
order by 
    ObjectName asc, t1.statement_start_offset asc;

过去我清楚动态查询的执行记录不会在这里显示,而且重编译后调用存储过程100次,若执行计划重建,特定语句的Execution_Count可能低于100。但最近两次遇到非动态语句完全不显示的情况,且这些语句不在条件分支的可选路径里:

  • 第一次移除嵌套/* */注释后问题解决,但现在删除所有注释后,最终的SELECT语句仍缺失;
  • 当前使用SQL Server 2025(兼容级别170),怀疑是新版本的变更或故障;
  • 批量测试中,执行sp_recompile后用不同参数调用存储过程127次,仅16次显示目标语句,且多为CPU消耗低的调用;但原代码的相同调用中语句正常显示;
  • 拆分代码后,将最终SELECT拆分为INSERT、多个UPDATE及小型SELECT,发现某UPDATE的指标始终缺失,而最终SELECT始终存在。

想请教:哪些情况会导致语句不显示?是否与语句长度、复杂度、特定功能有关?或是环境设置、跟踪标记等因素?


可能导致语句不显示的原因及排查方向

1. SQL Server 2025新优化特性影响

SQL Server 2025引入了语句级自动批处理、轻量级执行计划等新优化,部分低消耗的简单语句(如特定UPDATE/SELECT)可能被合并到更大的执行单元,不会单独在sys.dm_exec_query_stats生成统计条目。另外兼容级别170下的查询处理器行为变更,也可能改变了语句统计的收集逻辑。

2. 语句被查询处理器折叠或优化消除

如果语句满足以下条件,可能被优化器完全处理,不会生成独立的执行统计:

  • 语句逻辑可与上游操作合并(比如简单UPDATE与前置查询合并执行);
  • 因数据依赖被判定为无需实际执行(即使不在条件分支);
  • 触发常量折叠、谓词下推后,独立执行路径被消除。

3. 跟踪标记或环境配置异常

  • 启用了影响执行计划的跟踪标记(如TF 2451、TF 2335),可能改变统计信息的收集方式;
  • 数据库QUERY_STORE配置异常:处于只读状态或未启用时,可能影响sys.dm_exec_query_stats的统计持久化;
  • 服务器统计收集阈值调整:SQL Server默认可能不收集低消耗语句的详细统计,可检查sys.configurations中的相关配置项。

4. 语句长度与编译解析问题

  • 过长的存储过程或语句可能触发编译时的特殊处理,导致部分语句的统计无法单独捕获;
  • 即使删除了注释,语句中若存在不可见特殊字符,仍可能干扰SQL文本解析,导致statement_start_offset计算错误,查询无法匹配到目标语句。

5. 重编译与缓存异常

  • sp_recompile后的首次编译可能存在异常,部分语句的执行计划缓存条目未正确生成;
  • 参数敏感执行计划(PSP)在不同参数下生成的计划,部分统计信息未合并到sys.dm_exec_query_stats;
  • 服务器缓存压力大,低消耗语句的统计条目被提前淘汰。

排查建议

  • 用sys.dm_exec_query_plan查看存储过程完整执行计划,确认目标语句是否有独立执行节点;
  • 启用QUERY_STORE查看语句级统计,与sys.dm_exec_query_stats结果对比;
  • 用DBCC TRACESTATUS检查当前启用的跟踪标记;
  • 将缺失语句单独提取为存储过程,验证是否能正常捕获统计;
  • 临时降低兼容级别到160(SQL Server 2022),对比是否仍存在问题,确认是否为新版本特性导致。

内容的提问来源于stack exchange,提问作者Russ Perry Jr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.05 13:13:10