语法
sys.dm_exec_query_plan_stats ( plan_handle )
参数
plan_handle
一个令牌,用于唯一标识已执行的批处理的查询执行计划,并且其计划驻留在计划缓存中或当前正在执行。 plan_handle 是 varbinary(64)。
可以从下列动态管理对象中获得计划 plan_handle:
- sys.dm_exec_cached_plans (Transact-SQL)
- sys.dm_exec_query_stats (Transact-SQL)
- sys.dm_exec_requests (Transact-SQL)
- sys.dm_exec_procedure_stats (Transact-SQL)
- sys.dm_exec_trigger_stats (Transact-SQL)
返回的表
| 列名称 | 数据类型 | 说明 |
|---|---|---|
| dbid | smallint | 在编译对应于此计划的 Transact-SQL 语句时有效的上下文数据库的 ID。 对于临时和预定义 SQL 语句,指编译这些语句时所在的数据库的 ID。 此列可为空值。 |
| objectid | int | 此查询计划的对象(如存储过程或用户定义函数)的 ID。 对于即席批处理和已准备好的批处理,此列为 null。 此列可为空值。 |
| 数字 | smallint | 为存储过程编号的整数。 例如,用于 orders 应用程序的一组过程可命名为 orderproc;1、orderproc;2 等等。 对于即席批处理和已准备好的批处理,此列为 null。 此列可为空值。 |
| encrypted | bit | 指示对应的存储过程是否已加密。 0 = 未加密 1 = 已加密 列不可为 null。 |
| query_plan | xml | 包含使用 plan_handle 指定的实际查询执行计划的最后一个已知运行时 Showplan 表示形式。 显示计划的格式为 XML。 为包含即席 Transact-SQL 语句、存储过程调用以及用户定义函数调用等内容的每个批查询生成一个计划。 此列可为空值。 |
备注
这是一项可以选择使用的功能。 若要在服务器级别启用,请使用 跟踪标志 2451。 若要在数据库级别启用 ,请使用 ALTER DATABASE SCOPED CONFIGURATION (Transact-SQL) 中的 LAST_QUERY_PLAN_STATS 选项。
此系统函数在 轻型 查询执行统计信息分析基础结构下工作。 有关详细信息,请参阅查询分析基础结构。
显示计划输出由 sys.dm_exec_query_plan_stats 包含以下信息:
- 在缓存的计划中找到的所有编译时信息
- 运行时信息,例如每个运算符的实际行数、总查询 CPU 时间和执行时间、溢出警告、实际 DOP、最大已用内存和授予的内存
在以下情况下,返回的 表sys.dm_exec_query_plan_stats的 列中返回query_plan与实际执行计划等效的 Showplan 输出:
可以在 sys.dm_exec_cached_plans中找到该计划。
AND
正在执行的查询很复杂或消耗资源。
在以下情况下,在 返回的表sys.dm_exec_query_plan_stats的 列中返回query_plan简化的 1 Showplan 输出:
可以在 sys.dm_exec_cached_plans中找到该计划。
AND
查询非常简单,通常归类为 OLTP 工作负载的一部分。
1 指仅包含根节点运算符的 Showplan (SELECT) 。
在以下情况下,不会从 sys.dm_exec_query_plan_stats返回任何输出:
使用
plan_handle指定的查询计划已从计划缓存中逐出。OR
查询计划一开始不可缓存。 有关详细信息,请参阅 执行计划缓存和重用。
权限
要求具有对服务器的 VIEW SERVER STATE 权限。
SQL Server 2022 及更高版本的权限
需要对服务器具有 VIEW SERVER PERFORMANCE STATE 权限。
示例
A. 查看特定缓存计划的最后已知实际查询执行计划
以下示例查询 sys.dm_exec_cached_plans 以查找感兴趣的计划,并从输出中复制它 plan_handle 。
SELECT * FROM sys.dm_exec_cached_plans;
GO
然后,若要获取最后一个已知的实际查询执行计划,请将复制 plan_handle 的 与系统函数 sys.dm_exec_query_plan_stats一起使用。
SELECT * FROM sys.dm_exec_query_plan_stats(< copied plan_handle >);
GO
B. 查看所有缓存计划的上一个已知实际查询执行计划
SELECT *
FROM sys.dm_exec_cached_plans AS cp
CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st
CROSS APPLY sys.dm_exec_query_plan_stats(plan_handle) AS qps;
GO
C. 查看特定缓存计划和查询文本的最后已知实际查询执行计划
SELECT *
FROM sys.dm_exec_cached_plans AS cp
CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st
CROSS APPLY sys.dm_exec_query_plan_stats(plan_handle) AS qps
WHERE st.text LIKE 'SELECT * FROM Person.Person%';
GO
D. 查看触发器的缓存事件
SELECT *
FROM sys.dm_exec_cached_plans
CROSS APPLY sys.dm_exec_query_plan_stats(plan_handle)
WHERE objtype ='Trigger';



