共用方式為


sys.dm_exec_cached_plans(Transact-SQL)

適用於:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics分析平台系統(PDW)Microsoft Fabric 中的 SQL 資料庫

針對 SQL Server 快取的每個查詢計劃,傳回一個數據列,以加快查詢執行速度。 您可以使用此動態管理檢視來尋找快取的查詢計劃、快取的查詢文字、快取計劃所擷取的記憶體數量,以及快取計劃的重複使用計數。

在 Azure SQL 資料庫中,動態管理檢視無法暴露會影響資料庫包含性的資訊,或暴露使用者可存取的其他資料庫資訊。 為避免暴露這些資訊,所有包含不屬於該租戶資料的資料列都會被過濾掉。此外, memory_object_addresspool_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:預存程式
已備妥:備妥的語句
臨時查詢:臨時查詢。 是指使用 osqlsqlcmd 提交為語言事件的 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';