DBCC FREEPROCCACHE (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

プラン キャッシュからすべての要素を削除するか、プラン ハンドルまたは 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 および Analytics Platform System (PDW) の構文:

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

Note

SQL Server 2014 以前の Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。

引数

( { 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 動的管理ビューに対してクエリを実行します。

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

関連項目