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
相关产品推荐
相关产品推荐

