sys.dm_exec_query_plan_stats (Transact-SQL)

适用于: 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

返回的表

列名称 数据类型 描述
dbid smallint 在编译对应于此计划的 Transact-SQL 语句时有效的上下文数据库的 ID。 对于临时和预定义 SQL 语句,指编译这些语句时所在的数据库的 ID。

此列可为空值。
objectid int 此查询计划的对象(如存储过程或用户定义函数)的 ID。 对于临时和准备的批处理,此列为 null

此列可为空值。
number smallint 为存储过程编号的整数。 例如,订单应用程序的一组过程可以命名为 orderproc;1orderproc;2 等。 对于临时和准备的批处理,此列为 null

此列可为空值。
encrypted bit 指示对应的存储过程是否已加密。

0 = 未加密

1 = 已加密

列不可为 null。
query_plan xml 包含使用 plan_handle 指定的实际查询执行计划的最后一个已知运行时显示计划表示形式。 显示计划的格式为 XML。 为包含即席 Transact-SQL 语句、存储过程调用以及用户定义函数调用等内容的每个批查询生成一个计划。

此列可为空值。

注解

这是一项可以选择使用的功能。 要在服务器级别启用,请使用 跟踪标志 2451。 要在数据库级别启用,请使用 ALTER DATABASE SCOPED CONFIGURATION (Transact-SQL) 中的 LAST_QUERY_PLAN_STATS 选项。

此系统函数适用于“轻型”查询执行统计信息分析基础结构。 有关详细信息,请参阅查询分析基础结构

sys.dm_exec_query_plan_stats 输出的显示计划包含以下信息:

  • 缓存计划中找到的所有编译时信息
  • 运行时信息,例如每个运算符的实际行数、总计查询 CPU 时间和执行时间、溢写警告、实际 DOP、已用内存和已授予内存的最大数目

在以下情况下,在 query_plan 的返回表的 sys.dm_exec_query_plan_stats 列中返回等效于实际执行计划的显示计划输出

满足以下条件时,将在 query_plan 的返回表的 sys.dm_exec_query_plan_stats 列中返回“简化”1 的显示计划输出:

  • 可以在 sys.dm_exec_cached_plans 中找到此计划。

    AND

  • 查询非常简单,通常分类为 OLTP 工作负载的一部分。

1 指仅包含根节点运算符 (SELECT) 的显示计划。

在以下情况下,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。

权限

要求具有对服务器的 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';
GO

另请参阅