适用于: SQL Server 2019 (15.x)
Azure SQL 数据库
Azure SQL 托管实例
返回之前缓存的查询计划的最后一个已知实际执行计划的等效项。
语法
sys.dm_exec_query_plan_stats ( plan_handle )
参数
plan_handle
一个令牌,为已执行且其计划位于计划缓存中或当前正在执行的批次唯一标识查询执行计划。 plan_handle 是 varbinary(64)。
可以从下列动态管理对象中获得计划 plan_handle:
- sys.dm_exec_cached_plans
- sys.dm_exec_query_stats
- sys.dm_exec_requests
- sys.dm_exec_procedure_stats
- sys.dm_exec_trigger_stats
返回的表
| 列名称 | 数据类型 | 描述 |
|---|---|---|
dbid |
smallint | 在编译对应于此计划的 Transact-SQL 语句时有效的上下文数据库的 ID。 对于临时和预定义 SQL 语句,指编译这些语句时所在的数据库的 ID。 此列可为空值。 |
objectid |
int | 此查询计划的对象(如存储过程或用户定义函数)的 ID。 对于临时和准备的批处理,此列为 null。 此列可为空值。 |
number |
smallint | 为存储过程编号的整数。 例如,可以命名应用程序的一组过程orders,依此命名orderproc;1orderproc;2。 对于临时和准备的批处理,此列为 null。此列可为空值。 |
encrypted |
bit | 指示对应的存储过程是否已加密。 0 = 未加密 1 = 已加密 列不可为 null。 |
query_plan |
xml | 包含使用 plan_handle 指定的实际查询执行计划的最后一个已知运行时显示计划表示形式。 显示计划的格式为 XML。 为包含即席 Transact-SQL 语句、存储过程调用以及用户定义函数调用等内容的每个批查询生成一个计划。 此列可为空值。 |
注解
这是一项可以选择使用的功能。 若要在服务器级别启用,请使用 跟踪标志 2451。 若要在数据库级别启用,请使用 LAST_QUERY_PLAN_STATSALTER DATABASE SCOPED CONFIGURATION 中的选项。
此系统函数适用于“轻型”查询执行统计信息分析基础结构。 有关详细信息,请参阅查询分析基础结构。
sys.dm_exec_query_plan_stats 输出的显示计划包含以下信息:
缓存计划中找到的所有编译时信息
运行时信息,例如每个运算符的实际行数、查询 CPU 时间和执行时间总数、溢出警告、实际 DOP、最大已用内存和已授予内存
在以下情况下,在 的返回表的 query_plan 列中返回等效于sys.dm_exec_query_plan_stats:
可以在 sys.dm_exec_cached_plans 中找到此计划。
和
正在执行的查询很复杂或消耗资源。
满足以下条件时,将在 的返回表的 列中返回“简化”query_plansys.dm_exec_query_plan_stats 的显示计划输出:
可以在 sys.dm_exec_cached_plans 中找到此计划。
和
查询非常简单,通常分类为 OLTP 工作负载的一部分。
1 引用仅包含根节点运算符(SELECT)的 Showplan。
在以下情况下, 不会sys.dm_exec_query_plan_stats:
使用
plan_handle指定的查询计划已从计划缓存中逐出。或
查询计划最初不能缓存。 有关详细信息,请参阅执行计划缓存和重复使用。
注意
xml 数据类型中允许的嵌套级别数的限制意味着sys.dm_exec_query_plan无法返回满足或超过 128 个嵌套元素级别的查询计划。 在早期版本的 SQL Server 中,这种情况将导致无法返回查询计划,并生成错误 6335。 在 SQL Server 2005 (9.x) Service Pack 2 及更高版本中,该 query_plan 列返回 NULL。
权限
SQL Server 2019 (15.x) 和早期版本需要 VIEW SERVER STATE 对服务器具有权限。
SQL Server 2022 (16.x) 及更高版本需要 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';
GO