sys.dm_exec_plan_attributes (Transact-SQL)
適用於:SQL Server
針對計劃句柄所指定的計劃,針對每個計劃屬性傳回一個數據列。 您可以使用這個資料表值函式來取得特定計劃的詳細數據,例如快取索引鍵值或計劃目前同時執行的次數。
注意
透過此函式傳回的一些資訊會對應至 sys.syscacheobjects 回溯相容性檢視。
語法
sys.dm_exec_plan_attributes ( plan_handle )
引數
plan_handle
唯一識別已執行且其計劃位於計劃快取中的批次查詢計劃。 plan_handle 為 varbinary(64)。 您可以從動態管理檢視sys.dm_exec_cached_plans取得計劃句柄。
傳回的資料表
資料行名稱 | 資料類型 | 描述 |
---|---|---|
屬性 | varchar(128) | 與此計劃相關聯的屬性名稱。 下表緊接在此數據表下方列出可能的屬性、其數據類型及其描述。 |
value | sql_variant | 與這個計劃相關聯的屬性值。 |
is_cache_key | bit | 指出屬性是否用來作為計劃的快取查閱索引鍵的一部分。 |
在上述數據表中, 屬性 可以具有下列值:
屬性 | 資料類型 | 描述 |
---|---|---|
set_options | int | 指出計劃編譯的選項值。 |
objectid | int | 其中一個主要索引鍵,用於在快取中查閱物件。 這是儲存在資料庫物件的 sys.objects 中的物件標識碼(程序、檢視、觸發程式等等)。 對於類型為 “Adhoc” 或 “Prepared” 的計劃,它是批次文字的內部哈希。 |
dbid | int | 這是包含計劃所參考實體的資料庫標識碼。 針對臨機操作或備妥的計劃,它是執行批次的資料庫標識符。 |
dbid_execute | int | 對於儲存在 Resource 資料庫中的系統物件,執行快取計劃的資料庫識別碼。 若為所有其他情況,則為0。 |
user_id | int | 值 -2 表示提交的批次不相依於隱含名稱解析,而且可以在不同的使用者之間共用。 這是慣用的方法。 任何其他值代表在資料庫中提交查詢之使用者的使用者標識碼。 |
language_id | smallint | 建立快取物件之連接語言的標識碼。 如需詳細資訊,請參閱 sys.syslanguages (Transact-SQL) 。 |
date_format | smallint | 建立快取對象的連接日期格式。 如需詳細資訊,請參閱 SET DATEFORMAT (Transact-SQL)。 |
date_first | tinyint | 日期第一個值。 如需詳細資訊,請參閱 SET DATEFIRST (Transact-SQL). |
compat_level | tinyint | 表示編譯查詢計劃內容之資料庫中的相容性層級。 傳回的相容性層級是adhoc語句目前資料庫內容的相容性層級,而且不受查詢提示 QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n影響。 對於預存程式或函式中包含的語句,它會對應至建立預存程式或函式之資料庫的相容性層級。 |
status | int | 屬於快取查閱索引鍵一部分的內部狀態位。 |
required_cursor_options | int | 使用者指定的數據指標選項,例如數據指標類型。 |
acceptable_cursor_options | int | SQL Server 可能會隱含轉換成 的數據指標選項,以支援語句的執行。 例如,使用者可以指定動態數據指標,但允許查詢優化器將此數據指標類型轉換成靜態數據指標。 |
merge_action_type | smallint | 做為 MERGE 語句結果的觸發程式執行計劃類型。 0 表示非觸發程序計劃、未以 MERGE 語句結果執行的觸發計劃,或只指定 DELETE 動作之 MERGE 語句結果執行的觸發程式計劃。 1 表示以 MERGE 語句結果執行的 INSERT 觸發程序計劃。 2 表示以 MERGE 語句結果執行的 UPDATE 觸發程序計劃。 3 表示 DELETE 觸發程式計劃,其會以包含對應 INSERT 或 UPDATE 動作的 MERGE 語句結果執行。 對於由串聯動作執行的巢狀觸發程式,這個值是導致串聯的 MERGE 語句動作。 |
is_replication_specific | int | 表示編譯此計劃的會話是使用未記載的連接屬性連接到 SQL Server 實例的會話,可讓伺服器將會話識別為複寫元件所建立的會話,以便根據這類復寫元件預期變更伺服器特定功能層面的行為。 |
optional_spid | smallint | 聯機session_id (spid) 會成為快取索引鍵的一部分,以減少重新編譯的數目。 這可防止單一會話重新編譯涉及非動態系結臨時表的計劃。 |
optional_clr_trigger_dbid | int | 只有在 CLR DML 觸發程式的情況下才會填入 。 包含實體的資料庫標識碼。 針對任何其他物件類型,傳回零。 |
optional_clr_trigger_objid | int | 只有在 CLR DML 觸發程式的情況下才會填入 。 儲存在 sys.objects 中的物件識別碼。 針對任何其他物件類型,傳回零。 |
parent_plan_handle | varbinary(64) | 一律為 NULL。 |
is_azure_user_plan | tinyint | 1 適用於從使用者起始之會話的 Azure SQL 資料庫 中執行的查詢。 0 表示已從使用者未起始之會話執行的查詢,而是透過從 Azure 基礎結構內執行的應用程式,針對收集遙測或執行系統管理工作的其他用途發出查詢。 客戶不會針對查詢所耗用的資源收取費用,其中is_azure_user_plan = 0。 僅限 Azure SQL 資料庫。 |
inuse_exec_context | int | 目前執行中的批次數目,這些批次正在使用查詢計劃。 |
free_exec_context | int | 目前未使用的查詢計劃快取執行內容數目。 |
hits_exec_context | int | 從計劃快取中取得執行內容並重複使用的次數,可節省重新編譯 SQL 語句的額外負荷。 值是到目前為止所有批次執行的匯總。 |
misses_exec_context | int | 在計劃快取中找不到執行內容的次數,導致建立批次執行的新執行內容。 |
removed_exec_context | int | 因為快取計劃上的記憶體壓力而移除的執行內容數目。 |
inuse_cursors | int | 目前執行的批次數目,其中包含一或多個使用快取計劃的數據指標。 |
free_cursors | int | 快取計劃的閑置或可用數據指標數目。 |
hits_cursors | int | 非使用中數據指標從快取計劃取得並重複使用的次數。 值是到目前為止所有批次執行的匯總。 |
misses_cursors | int | 快取中找不到非使用中數據指標的次數。 |
removed_cursors | int | 因為快取計劃上的記憶體壓力而移除的數據指標數目。 |
sql_handle | varbinary(64) | 批次的 SQL 句柄。 |
權限
在 SQL Server 上,需要 VIEW SERVER STATE
許可權。
在 Azure SQL 資料庫 Basic、S0 和 S1 服務目標上,以及彈性集區中的資料庫,需要伺服器管理員帳戶或Microsoft Entra 系統管理員帳戶。 在所有其他 SQL 資料庫 服務目標上,VIEW DATABASE STATE
資料庫需要許可權。
SQL Server 2022 和更新版本的權限
需要伺服器上的 VIEW SERVER PERFORMANCE STATE 權限。
備註
Set 選項
相同已編譯計劃的複本可能只有set_options數據行中的值不同。 這表示不同的聯機會針對相同的查詢使用不同的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)、平行計劃(2)和 ANSI_PADDING (1)。
選項 | 值 |
---|---|
ANSI_PADDING | 1 |
ParallelPlan 表示計劃平行處理原則選項已變更。 |
2 |
FORCEPLAN | 4 |
CONCAT_NULL_YIELDS_NULL | 8 |
ANSI_WARNINGS | 16 |
ANSI_NULLS | 32 |
QUOTED_IDENTIFIER | 64 |
ANSI_NULL_DFLT_ON | 128 |
ANSI_NULL_DFLT_OFF | 256 |
NoBrowseTable 表示計劃不會使用工作數據表來實作 FOR BROWSE 作業。 |
512 |
TriggerOneRow 表示計劃包含 AFTER 觸發程式差異數據表的單一數據列優化。 |
1024 |
ResyncQuery 指出查詢是由內部系統預存程式送出。 |
2048 |
ARITH_ABORT | 4096 |
NUMERIC_ROUNDABORT | 8192 |
DATEFIRST | 16384 |
DATEFORMAT | 32768 |
LanguageID | 65536 |
後 表示編譯計劃時,DATABASE 選項PARAMETERIZATION已設定為 FORCED。 |
131072 |
ROWCOUNT | 適用於: SQL Server 2012 (11.x) 和更新版本 262144 |
資料指標
非使用中數據指標會快取在編譯的計劃中,讓用來儲存數據指標的記憶體可供數據指標的並行使用者重複使用。 例如,假設批次宣告並使用數據指標,而不需解除分配。 如果有兩個使用者執行相同的批次,則會有兩個作用中的數據指標。 一旦解除分配數據指標(可能在不同的批次中),用來儲存數據指標的記憶體就會快取且未釋放。 此非使用中數據指標清單會保留在已編譯的計劃中。 下次使用者執行批次時,快取的數據指標記憶體將會重複使用並適當地初始化為使用中數據指標。
評估數據指標選項
若要將required_cursor_options中傳回的值轉譯為acceptable_cursor_options到編譯計劃的選項,請從數據行值減去值,從最大的可能值開始,直到達到0為止。 您減去的每個值都會對應至查詢計劃中使用的數據指標選項。
選項 | 值 |
---|---|
無 | 0 |
INSENSITIVE | 1 |
SCROLL | 2 |
READ ONLY | 4 |
FOR UPDATE | 8 |
LOCAL | 16 |
GLOBAL | 32 |
FORWARD_ONLY | 64 |
KEYSET | 128 |
DYNAMIC | 256 |
SCROLL_LOCKS | 512 |
OPTIMISTIC | 1024 |
STATIC | 2048 |
FAST_FORWARD | 4096 |
就地 | 8192 |
FOR select_statement | 16384 |
範例
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)