sys.dm_exec_plan_attributes (Transact-SQL)

 

本主题适用于:是SQL Server(从 2008 开始)否Azure SQL 数据库否Azure SQL 数据仓库否并行数据仓库

针对计划句柄所指定计划的每个计划属性返回一行。 可以使用此表值函数获取有关特定计划的详细信息,例如计划的缓存键值或当前同步执行次数。

System_CAPS_ICON_note.jpg 说明


通过返回的信息的一些此函数将映射到sys.syscacheobjects向后兼容性视图。

  
sys.dm_exec_plan_attributes ( plan_handle )  

plan_handle 收集
用于唯一标识已执行并且其计划驻留在计划缓存中的批处理的查询计划。 plan_handlevarbinary(64)。 可以从获取的计划句柄sys.dm_exec_cached_plans动态管理视图。

列名数据类型Description
属性varchar (128)与此计划关联的属性的名称。 立即下此表列出了可能的属性,其数据类型,及其说明。
sql_variant与此计划关联的属性的值。
is_cache_key指示此属性是否用作计划的缓存查找密钥的一部分。
Attribute数据类型Description
set_optionsint指示编译计划所使用的选项值。
objectidint用于在缓存中查找对象的主键之一。 这是的对象 ID 存储在sys.objects的数据库对象 (过程、 视图、 触发器和等等)。 对于类型为“即席”或“已准备好”的计划,它是批处理文本的内部哈希。
dbidint是包含计划引用的实体的数据库 ID。

对于即席计划或已准备好的计划,它是执行批处理的数据库 ID。
dbid_executeint为系统对象存储在资源数据库,从其执行缓存的计划的数据库 ID。 对于所有其他情况,均为 0。
user_idint值 -2 指示已提交的批处理不依赖于隐式名称解析并可在不同的用户间共享。 这是首选方法。 任何其他值表示数据库中提交查询的用户的用户 ID。
language_idsmallint创建缓存对象的连接的语言 ID。 有关详细信息,请参阅sys.syslanguages (TRANSACT-SQL)
date_formatsmallint创建缓存对象的连接的日期格式。 有关详细信息,请参阅SET DATEFORMAT (TRANSACT-SQL)
date_firsttinyint第一个日期值。 有关详细信息,请参阅SET DATEFIRST (TRANSACT-SQL)
statusint缓存查找密钥中的内部状态位。
required_cursor_optionsint用户指定的游标选项,例如游标类型。
acceptable_cursor_optionsint为了支持语句的执行,SQL Server 可以隐式转换采用的游标选项。 例如,用户可能指定一个动态游标,但允许查询优化器将此游标类型转换为静态游标。
inuse_exec_contextint使用查询计划并且当前正在执行的批处理的数目。
free_exec_contextint当前未使用的查询计划的缓存执行上下文数目。
hits_exec_contextint从计划缓存获取执行上下文并重用从而节省 SQL 语句编译开销的次数。 该值是目前所有批处理执行的聚合。
misses_exec_contextint无法在计划缓存中找到执行上下文而导致为批处理执行创建新的执行上下文的次数。
removed_exec_contextint由于缓存计划的内存压力而删除的执行上下文数目。
inuse_cursorsint包含一个或多个使用缓存计划的游标的当前正在执行的批数。
free_cursorsint缓存计划的空闲或可用游标数。
hits_cursorsint从缓存计划获得不活动游标并重用的次数。 该值是目前所有批处理执行的聚合。
misses_cursorsint无法在缓存中找到不活动游标的次数。
removed_cursorsint由于缓存计划的内存压力而删除的游标数。
sql_handlevarbinary(64)批处理的 SQL 句柄。
merge_action_typesmallint用作 MERGE 语句结果的触发器执行计划的类型。

0 表示非触发器计划,或者不会作为 MERGE 语句结果来执行的触发器计划,或者作为仅指定 DELETE 操作的 MERGE 语句结果执行的触发器计划。

1 表示作为 MERGE 语句结果运行的 INSERT 触发器计划。

2 表示作为 MERGE 语句结果运行的 UPDATE 触发器计划。

3 表示一个作为包含对应的 INSERT 或 UPDATE 操作的 MERGE 语句结果运行的 DELETE 触发器计划。

对于由级联操作运行的嵌套触发器,此值是导致级联的 MERGE 语句的操作。

上SQL Server需要服务器上的 VIEW SERVER STATE 权限。

上SQL Database高级层需要 VIEW DATABASE STATE 权限的数据库中。 上SQL Database标准版和基本层需要SQL Database管理员帐户。

相同的编译计划的副本可能只是中的值不同set_options列。 这说明不同的连接为相同的查询使用不同的 SET 选项集。 通常不希望使用不同的选项集,因为这可能导致额外的编译工作、减少计划重用并由于缓存中的多个计划副本而导致计划缓存膨胀。

计算 Set 选项

转换中返回的值set_options到编译计划所用的选项,将值相减从set_options值,从最大可能值,直到达到 0。 所减去的每个值对应于查询计划中所用的一个选项。 例如,如果中的值set_options 251,编译计划所使用的选项为 ANSI_NULL_DFLT_ON (128)、 QUOTED_IDENTIFIER (64)、 ANSI_NULLS(32)、 ANSI_WARNINGS (16)、 CONCAT_NULL_YIELDS_NULL (8)、 并行 Plan(2) 和 ANSI_PADDING (1)。

选项Value
ANSI_PADDING1
Parallel Plan2
FORCEPLAN4
CONCAT_NULL_YIELDS_NULL8
ANSI_WARNINGS16
ANSI_NULLS32
QUOTED_IDENTIFIER64
ANSI_NULL_DFLT_ON128
ANSI_NULL_DFLT_OFF256
NoBrowseTable

指示计划不使用工作表实现 FOR BROWSE 操作。
512
TriggerOneRow

指示计划包含针对 AFTER 触发器 delta 表的单行优化。
1024
ResyncQuery

指示查询由内部系统存储过程提交。
2048
ARITH_ABORT4096
NUMERIC_ROUNDABORT8192
DATEFIRST16384
DATEFORMAT32768
LanguageID65536
UPON

指示编译计划时数据库选项 PARAMETERIZATION 设置为 FORCED。
131072
ROWCOUNT适用于︰ SQL Server 2012到SQL Server 2016

262144

不活动游标缓存在编译的计划中,以便游标的并发用户可以重用存储游标所使用的内存。 例如,假设某批处理声明并使用了一个游标,但未释放该游标。 如果有两个用户执行同一个批处理,将有两个活动游标。 游标释放(可能在不同批处理中)后,用于存储该游标的内存就会缓存但不释放。 此不活动游标列表保存在编译的计划中。 下次用户执行该批处理时,缓存的游标内存将重用并相应地初始化为活动游标。

计算游标选项

转换中返回的值required_cursor_optionsacceptable_cursor_options到编译计划所用的选项,减去从列的值,从最大可能值,直到达到 0 的值。 所减去的每个值对应于查询计划中所用的一个游标选项。

选项Value
0
INSENSITIVE1
SCROLL2
READ ONLY4
FOR UPDATE8
LOCAL16
GLOBAL32
FORWARD_ONLY64
KEYSET128
DYNAMIC256
SCROLL_LOCKS512
OPTIMISTIC1024
STATIC2048
FAST_FORWARD4096
IN PLACE8192
有关select_statement16384

A. 返回特定计划的属性

下例将返回指定计划的所有计划属性。 将首先查询 sys.dm_exec_cached_plans 动态管理视图以获得指定计划的计划句柄。 在第二次查询中,用第一次查询中的计划句柄值替换 <plan_handle>

SELECT plan_handle, refcounts, usecounts, size_in_bytes, cacheobjtype, objtype   
FROM sys.dm_exec_cached_plans;  
GO  
SELECT attribute, value, is_cache_key  
FROM sys.dm_exec_plan_attributes(<plan_handle>);  
GO  

B. 返回编译计划的 SET 选项和缓存计划的 SQL 句柄

下例将返回代表编译每个计划时所用选项的值。 此外,还将返回所有缓存计划的 SQL 句柄。

SELECT plan_handle, pvt.set_options, pvt.sql_handle  
FROM (  
    SELECT plan_handle, epa.attribute, epa.value   
    FROM sys.dm_exec_cached_plans   
        OUTER APPLY sys.dm_exec_plan_attributes(plan_handle) AS epa  
    WHERE cacheobjtype = 'Compiled Plan') AS ecpa   
PIVOT (MAX(ecpa.value) FOR ecpa.attribute IN ("set_options", "sql_handle")) AS pvt;  
GO  

动态管理视图和函数 (TRANSACT-SQL)
执行相关的动态管理视图和函数 (TRANSACT-SQL)
sys.dm_exec_cached_plans (TRANSACT-SQL)
sys.databases (TRANSACT-SQL)
sys.objects (TRANSACT-SQL)

社区附加资源

添加
显示: