DBCC FREEPROCCACHE (Transact-SQL)

適用於:SQL ServerAzure SQL 資料庫Azure SQL 受控執行個體Azure Synapse AnalyticsMicrosoft Fabric 中的 SQL 資料庫

從計畫快取移除所有元素;指定計畫控制代碼或 SQL 控制代碼,從計畫快取移除特定的計畫;或是移除與指定的資源集區相關聯的所有快取項目。

注意

DBCC FREEPROCCACHE 不會清除原生編譯預存程序的執行統計資料。 程序快取不包含原生編譯預存程序的相關資訊。 從程序執行收集的任何執行統計資料,都會顯示在執行統計資料 DMV 中:sys.dm_exec_procedure_stats (Transact-SQL)sys.dm_exec_query_plan (Transact-SQL)

Transact-SQL 語法慣例

語法

SQL Server 和 Azure SQL Database 的語法:

DBCC FREEPROCCACHE [ ( { plan_handle | sql_handle | pool_name } ) ] [ WITH NO_INFOMSGS ]

Azure Synapse Analytics 的語法:

DBCC FREEPROCCACHE [ ( COMPUTE | ALL ) ]
     [ WITH NO_INFOMSGS ]
[;]

引數

( { plan_handle | sql_handle | pool_name } )

plan_handle 會唯一識別批次的查詢計劃,該批次已經執行,且其計劃位於計畫快取中。 plan_handlevarbinary(64),並可從下列動態管理物件中取得:

sql_handle 是要清除之批次的 SQL 控制代碼。 sql_handlevarbinary(64),並可從下列動態管理物件中取得:

pool_name 是 Resource Governor 資源集區的名稱。 pool_namesysname,並可以藉由查詢 sys.dm_resource_governor_resource_pools 動態管理檢視來取得。

若要將 Resource Governor 工作負載群組與資源集區產生關聯,請查詢 sys.dm_resource_governor_workload_groups 動態管理檢視。 如需工作階段之工作負載群組的相關資訊,請查詢 sys.dm_exec_sessions 動態管理檢視。

與NO_INFOMSGS

隱藏所有參考訊息。

COMPUTE

清除每個計算節點中的查詢計劃快取。 這是預設值。

ALL

清除每個計算節點和控制節點中的查詢計劃快取。

注意

從 2016 SQL Server 2016 (13.x) 開始,ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE 可用來清除目前資料庫的程序 (計畫) 快取。

備註

請利用 DBCC FREEPROCCACHE 小心清除計畫快取。 清除程序 (計畫) 快取會使所有計畫被收回,且傳入的查詢執行會編譯新的計畫,而非重複使用任何先前的快取計畫。

當新的編譯數目增加時,可能會造成查詢效能突然暫時降低。 針對計畫快取中每個清除的快取存放區,SQL Server 錯誤記錄檔會包含下列資訊訊息:

SQL Server has encountered %d occurrence(s) of cachestore flush for the '%s' cachestore (part of plan cache) due to 'DBCC FREEPROCCACHE' or 'DBCC FREESYSTEMCACHE' operations.

只要在該時間間隔內快取發生排清,這個訊息就會每五分鐘記錄一次。

下列重新設定作業也會清除程序快取:

  • 存取檢查快取 Bucket 計數
  • 存取檢查快取配額
  • 已啟用 CLR
  • 平行處理原則的成本臨界值
  • 跨資料庫擁有權鏈化
  • 索引建立記憶體
  • 平行處理原則的最大程度
  • 最大伺服器記憶體
  • 最大文字重複大小
  • 最大工作者執行緒
  • 每個查詢的記憶體下限
  • 最小伺服器記憶體
  • 查詢管理者成本限制
  • 查詢等候
  • 遠端查詢逾時
  • 使用者選項

在 Azure SQL Database 中,DBCC FREEPROCCACHE 會在裝載目前資料庫或彈性集區的資料庫引擎執行個體上運作。 在使用者資料庫中執行 DBCC FREEPROCCACHE 會清除該資料庫的計畫快取。 如果資料庫在彈性集區中,也會清除該彈性集區中所有其他資料庫的計畫快取。 在 master 資料庫中執行此命令,不會對相同邏輯伺服器上的其他資料庫造成影響。 在使用 Basic、S0 或 S1 服務目標的資料庫中執行此命令,可能會清除在相同邏輯伺服器上使用這些服務目標之其他資料庫中的計畫快取。

結果集

未指定 WITH NO_INFOMSGS 子句時,DBCC FREEPROCCACHE 會傳回:

DBCC execution completed. If DBCC printed error messages, contact your system administrator.

權限

適用於:SQL Server

  • 需要伺服器的 ALTER SERVER STATE 權限。

適用於:Azure SQL Database

  • 需要伺服器角色 ##MS_ServerStateManager## 中的成員資格。

適用於:Azure Synapse Analytics

  • 需要 db_owner 固定資料庫角色中的成員資格。

Remarks for Azure Synapse Analytics

可並行執行多個 DBCC FREEPROCCACHE 命令。

在 Azure Synapse Analytics 中,清除計畫快取可能會導致查詢效能暫時下降,因為輸入查詢會編譯新的計畫,而非重複使用先前快取的計畫。

DBCC FREEPROCCACHE (COMPUTE) 只會導致 SQL Server 重新編譯在計算節點上執行的查詢, 它不會讓 Azure Synapse Analytics 重新編譯在控制節點產生的平行查詢計畫。

DBCC FREEPROCCACHE 可以在執行期間取消。

Azure Synapse Analytics 的限制

DBCC FREEPROCCACHE 無法在交易內執行。

EXPLAIN 陳述式中不支援 DBCC FREEPROCCACHE

Metadata for Azure Synapse Analytics

執行 sys.pdw_exec_requests 時,會在 DBCC FREEPROCCACHE 系統檢視表中新增一個資料列。

範例:SQL Server

A. 從計畫快取清除查詢計劃

下列範例會從計畫快取中指定查詢計劃控制代碼,藉以清除查詢計劃。 為確保範例查詢位於計畫快取中,會先執行查詢。 系統會查詢 sys.dm_exec_cached_planssys.dm_exec_sql_text 動態管理檢視以傳回查詢的計劃控制代碼。

然後會將結果集中的計畫控制代碼值插入到 DBCC FREEPROCACHE 陳述式中,就可以從計畫快取中僅移除該計畫。

USE AdventureWorks2022;
GO
SELECT * FROM Person.Address;
GO
SELECT plan_handle, st.text
FROM sys.dm_exec_cached_plans
CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st
WHERE text LIKE N'SELECT * FROM Person.Address%';
GO

結果集如下所示。

plan_handle                                         text
--------------------------------------------------  -----------------------------
0x060006001ECA270EC0215D05000000000000000000000000  SELECT * FROM Person.Address;
  
(1 row(s) affected)
-- Remove the specific plan from the cache.
DBCC FREEPROCCACHE (0x060006001ECA270EC0215D05000000000000000000000000);
GO

B. 從計畫快取清除所有計畫

下列範例會從計畫快取中清除所有元素。 指定子 WITH NO_INFOMSGS 句是為了防止顯示資訊訊息。

DBCC FREEPROCCACHE WITH NO_INFOMSGS;

C. 清除與資源集區相關聯的所有快取項目

下列範例會清除與指定之資源集區有關聯的所有快取項目。 系統會先查詢 sys.dm_resource_governor_resource_pools 檢視,以取得 pool_name 的值。

SELECT * FROM sys.dm_resource_governor_resource_pools;
GO
DBCC FREEPROCCACHE ('default');
GO

範例:Azure Synapse Analytics

D. DBCC FREEPROCCACHE 基本語法

下列範例會移除計算節點中所有現有的查詢計劃快取。 雖然內容是設定為 UserDbSales,但系統會移除所有資料庫的計算節點查詢計劃。 WITH NO_INFOMSGS 子句可防止結果中出現資訊訊息。

USE UserDbSales;
DBCC FREEPROCCACHE (COMPUTE) WITH NO_INFOMSGS;

下列範例和前一個範例的結果相同,不同的是資訊訊息會出現在結果中。

USE UserDbSales;
DBCC FREEPROCCACHE (COMPUTE);

當要求資訊訊息且執行成功時,查詢結果針對每個計算節點都會顯示一行。

E. 授與執行 DBCC FREEPROCCACHE 的權限

下列範例會將執行 David 的權限授與 DBCC FREEPROCCACHE 登入。

GRANT ALTER SERVER STATE TO David;
GO