sys.dm_exec_plan_attributes (Transact-SQL)
針對計畫控制代碼所指定計畫的每個計畫屬性,各傳回一個資料列。 您可以使用這個資料表值函式取得特定計畫的詳細資料,例如快取索引鍵值或目前同時執行計畫數目。
[!附註]
透過這個函數傳回的部分資訊會對應至 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 |
指出屬性是否作為計畫快取查閱金鑰的一部分使用。 |
權限
需要伺服器的 VIEW SERVER STATE 權限。
備註
Set 選項
相同編譯計畫的副本可能只有 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)、Parallel Plan(2) 和 ANSI_PADDING (1)。
選項 |
值 |
---|---|
ANSI_PADDING |
1 |
Parallel Plan |
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 |
UPON 表示當編譯計畫時,PARAMETERIZATION 資料庫選項設為 FORCED。 |
131072 |
資料指標
非使用中的資料指標會快取在編譯的計畫中,讓用來儲存資料指標的記憶體可供資料指標的並行使用者重複使用。 例如,假設有個批次宣告並使用資料指標,但沒有取消配置。 如果有兩個使用者執行相同的批次,會有兩個使用中的資料指標。 一旦資料指標取消配置 (可能在不同的批次中),用來儲存資料指標的記憶體就會快取,而不會釋出。 非使用中資料指標的清單會保留在編譯的計畫中。 等到下次使用者執行批次時,會重複使用快取的資料指標記憶體,並適當地初始化為使用中資料指標。
評估資料指標選項
若要將 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 |
IN PLACE |
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