DBCC FREEPROCCACHE (Transact-SQL)
適用対象: SQL Server Azure SQL データベース Azure SQL Managed Instance 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
各計算ノードと各制御ノードからクエリ プラン キャッシュを消去します。
Note
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.
このメッセージは、5 分以内にキャッシュがフラッシュされる限り、5 分間隔でログに記録されます。
次の再構成操作でもプロシージャ キャッシュはクリアされます。
- access check cache bucket count
- access check cache quota
- clr enabled
- cost threshold for parallelism
- cross db ownership chaining
- index create memory
- max degree of parallelism
- max server memory
- max text repl size
- max worker threads
- min memory per query
- min server memory
- query governor cost limit
- query wait
- 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 データベース
- サーバー ロール ##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
はトランザクション内で実行できません。
DBCC FREEPROCCACHE
は EXPLAIN ステートメント内でサポートされていません。
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);
情報メッセージが要求されて実行が成功すると、クエリの結果にはコンピューティング ノードごとに 1 行が含まれます。
E. DBCC FREEPROCCACHE を実行するアクセス許可を付与する
次の例では、DBCC FREEPROCCACHE
を実行するためのログイン David
アクセス許可を付与します。
GRANT ALTER SERVER STATE TO David;
GO