適用於:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
分析平台系統(PDW)
Microsoft Fabric 中的 SQL 資料庫
針對 SQL Server 快取的每個查詢計劃,傳回一個數據列,以加快查詢執行速度。 您可以使用此動態管理檢視來尋找快取的查詢計劃、快取的查詢文字、快取計劃所擷取的記憶體數量,以及快取計劃的重複使用計數。
在 Azure SQL 資料庫中,動態管理檢視無法暴露會影響資料庫包含性的資訊,或暴露使用者可存取的其他資料庫資訊。 為避免暴露這些資訊,所有包含不屬於該租戶資料的資料列都會被過濾掉。此外, memory_object_address 和 pool_id 欄的值也會被過濾;欄位值設為 NULL。
注意
若要從 Azure Synapse Analytics 或 Analytics Platform System (PDW) 呼叫此專案,請使用 名稱 sys.dm_pdw_nodes_exec_cached_plans。 Azure Synapse Analytics 的無伺服器 SQL 集區不支援此語法。
| 資料行名稱 | 資料類型 | 描述 |
|---|---|---|
bucketid |
int | 快取專案所在的哈希值區標識碼。 值表示範圍從 0 到快取類型的哈希表大小。 對於 SQL 計畫與物件計畫快取,雜湊表大小在 32 位元系統最高可達 10,007,64 位元系統最高可達 40,009。 對於綁定樹快取,雜湊表大小在32位元系統上可達1,009,在64位元系統中最高可達4,001。 針對擴充預存程式快取,哈希表大小在32位和64位系統上最多可達127。 |
refcounts |
int | 參考此快取物件的快取物件數目。
refcounts 快取中必須至少有 1 個條目。 |
usecounts |
int | 快取物件的查閱次數。 參數化查詢在快取中尋找計劃時,不會遞增。 使用 showplan 時,可以遞增多次。 |
size_in_bytes |
int | 快取物件所耗用的位元組數目。 |
memory_object_address |
varbinary(8) | 快取項目的記憶體位址。 這個值可以與 sys.dm_os_memory_objects 搭配使用,以取得快取計劃的記憶體明細,以及搭配 sys.dm_os_memory_cache_entries_entries 以取得快取專案的成本。 |
cacheobjtype |
nvarchar(34) | 快取中的物件類型。 其價值可以是以下之一: 已編譯的計劃 已編譯的計劃存根 剖析樹狀結構 擴充程式 CLR 編譯的 Func CLR 編譯的 Proc |
objtype |
nvarchar(16) | 物件的類型。 以下是可能的值及其對應的描述。 Proc:預存程式 已備妥:備妥的語句 臨時查詢:臨時查詢。 是指使用 osql 或 sqlcmd 提交為語言事件的 Transact-SQL,而不是做為遠端過程調用。 ReplProc:Replication-filter-procedure 觸發程式:觸發程式 檢視:檢視 預設值:預設值 UsrTab:用戶數據表 SysTab:系統數據表 檢查:CHECK 條件約束 規則:規則 |
plan_handle |
varbinary(64) | 記憶體中計畫的識別碼。 這個識別碼是暫時性的,只有當計畫留在快取時才會保留。 此值可用於以下動態管理函數: sys.dm_exec_sql_text sys.dm_exec_query_plan sys.dm_exec_plan_attributes |
pool_id |
int | 為此計劃記憶體使用量所考慮的資源集區標識碼。 |
pdw_node_id |
int | 此散發節點的標識碼。 適用於:Azure Synapse Analytics、Analytics Platform System (PDW) |
權限
SQL Server 2019 (15.x) 和更早版本需要 VIEW SERVER STATE 許可權。
SQL Server 2022(16.x)及更新版本,以及 Azure SQL Managed Instance,都需要 VIEW SERVER PERFORMANCE STATE 權限。
在 Azure SQL 資料庫 Basic、S0 和 S1 在所有其他 SQL Database 服務目標上,需要資料庫的 VIEW DATABASE STATE 權限或 ##MS_ServerStateReader## 伺服器角色的成員資格。
範例
A. 回傳被重複使用的快取項目的批次文本
下列範例會傳回已多次使用之所有快取專案的SQL 文字。
SELECT usecounts,
cacheobjtype,
objtype,
text
FROM sys.dm_exec_cached_plans
CROSS APPLY sys.dm_exec_sql_text(plan_handle)
WHERE usecounts > 1
ORDER BY usecounts DESC;
B. 回傳所有快取觸發器的查詢計畫
下列範例會傳回所有快取觸發程式的查詢計劃。
SELECT plan_handle,
query_plan,
objtype
FROM sys.dm_exec_cached_plans
CROSS APPLY sys.dm_exec_query_plan(plan_handle)
WHERE objtype = 'Trigger';
C. 回傳當時編譯計畫時所使用的 SET 選項
以下範例回傳 SET 了該計畫編譯時所使用的選項。
sql_handle也會傳回計畫的 。
PIVOT運算子用於輸出set_options屬性sql_handle為欄位,而非列。 關於該 set_options數值的更多資訊,請參見 sys.dm_exec_plan_attributes。
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;
D. 回傳所有快取編譯計畫的記憶體分解
下列範例會傳回快取中所有已編譯計劃所使用的記憶體明細。
SELECT plan_handle,
ecp.memory_object_address AS CompiledPlan_MemoryObject,
omo.memory_object_address,
type,
page_size_in_bytes
FROM sys.dm_exec_cached_plans AS ecp
INNER JOIN sys.dm_os_memory_objects AS omo
ON ecp.memory_object_address = omo.memory_object_address
OR ecp.memory_object_address = omo.parent_address
WHERE cacheobjtype = 'Compiled Plan';