DBCC FREEPROCCACHE (Transact-SQL)
適用於: SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW)
從計畫快取移除所有元素;指定計畫控制代碼或 SQL 控制代碼,從計畫快取移除特定的計畫;或是移除與指定的資源集區相關聯的所有快取項目。
注意
DBCC FREEPROCCACHE
不會清除原生編譯預存程序的執行統計資料。 程序快取不包含原生編譯預存程序的相關資訊。 從程序執行收集的任何執行統計資料,都會顯示在執行統計資料 DMV 中:sys.dm_exec_procedure_stats (Transact-SQL) 和 sys.dm_exec_query_plan (Transact-SQL)。
語法
SQL Server 和 Azure SQL Database 的語法:
DBCC FREEPROCCACHE [ ( { plan_handle | sql_handle | pool_name } ) ] [ WITH NO_INFOMSGS ]
Azure Synapse Analytics 和 Analytics Platform System (PDW) 的語法:
DBCC FREEPROCCACHE [ ( COMPUTE | ALL ) ]
[ WITH NO_INFOMSGS ]
[;]
引數
( { plan_handle | sql_handle | pool_name } )
plan_handle 會唯一識別批次的查詢計劃,該批次已經執行,且其計劃位於計畫快取中。 plan_handle 為 varbinary(64),並可從下列動態管理物件中取得:
- sys.dm_exec_cached_plans
- sys.dm_exec_requests
- sys.dm_exec_query_memory_grants
- sys.dm_exec_query_stats
sql_handle 是要清除之批次的 SQL 控制代碼。 sql_handle 為 varbinary(64),並可從下列動態管理物件中取得:
- sys.dm_exec_query_stats
- sys.dm_exec_requests
- sys.dm_exec_cursors
- sys.dm_exec_xml_handles
- sys.dm_exec_query_memory_grants
pool_name 是 Resource Governor 資源集區的名稱。 pool_name 是 sysname,並可以藉由查詢 sys.dm_resource_governor_resource_pools 動態管理檢視來取得。
若要將 Resource Governor 工作負載群組與資源集區產生關聯,請查詢 sys.dm_resource_governor_workload_groups 動態管理檢視。 如需工作階段之工作負載群組的相關資訊,請查詢 sys.dm_exec_sessions 動態管理檢視。
WITH 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 enabled
- 平行處理原則的成本臨界值
- cross db ownership chaining
- 索引建立記憶體
- 平行處理原則的最大程度
- max server memory
- max text repl size
- 最大工作者執行緒
- min memory per query
- min server memory
- 查詢管理者成本限制
- 查詢等候
- remote query timeout
- user options
在 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、Analytics Platform System (PDW)
- 需要伺服器的 ALTER SERVER STATE 權限。
適用於:Azure SQL Database
- 需要伺服器角色 ##MS_ServerStateManager## 中的成員資格。
適用於:Azure Synapse Analytics
- 需要 db_owner 固定資料庫角色中的成員資格。
Azure Synapse Analytics 和 Analytics Platform System (PDW) 的備註
可並行執行多個 DBCC FREEPROCCACHE
命令。
在 Azure Synapse Analytics 或 Analytics Platform System (PDW) 中,清除計畫快取可能會導致查詢效能暫時降低,因為傳入的查詢會編譯新的計畫,而不是重複使用任何先前快取的計畫。
DBCC FREEPROCCACHE (COMPUTE)
只會導致 SQL Server 重新編譯在計算節點上執行的查詢, 而不會導致 Azure Synapse Analytics 或 Analytics Platform System (PDW) 重新編譯在控制節點上產生的平行查詢計劃。
DBCC FREEPROCCACHE
可以在執行期間取消。
Azure Synapse Analytics 和 Analytics Platform System (PDW) 的限制事項
DBCC FREEPROCCACHE
無法在交易內執行。
EXPLAIN 陳述式中不支援 DBCC FREEPROCCACHE
。
Azure Synapse Analytics 和 Analytics Platform System (PDW) 的中繼資料
執行 DBCC FREEPROCCACHE
時,會在 sys.pdw_exec_requests
系統檢視表中新增一個資料列。
範例:SQL Server
A. 從計畫快取清除查詢計劃
下列範例會從計畫快取中指定查詢計劃控制代碼,藉以清除查詢計劃。 為確保範例查詢位於計畫快取中,會先執行查詢。 系統會查詢 sys.dm_exec_cached_plans
和 sys.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 和 Analytics Platform System (PDW)
D. DBCC FREEPROCCACHE 基本語法
下列範例會移除計算節點中所有現有的查詢計劃快取。 雖然內容是設定為 UserDbSales
,但系統會移除所有資料庫的計算節點查詢計劃。 WITH NO_INFOMSGS
子句可防止結果中出現資訊訊息。
USE UserDbSales;
DBCC FREEPROCCACHE (COMPUTE) WITH NO_INFOMSGS;
下列範例和前一個範例的結果相同,不同的是資訊訊息會出現在結果中。
USE UserDbSales;
DBCC FREEPROCCACHE (COMPUTE);
當要求資訊訊息且執行成功時,查詢結果針對每個計算節點都會顯示一行。
E. 授與執行 DBCC FREEPROCCACHE 的權限
下列範例會將執行 DBCC FREEPROCCACHE
的權限授與 David
登入。
GRANT ALTER SERVER STATE TO David;
GO