SQL Serverの性能検証やトラブル調査では、DBCC FREEPROCCACHEというコマンドを使用する場面があります。しかし、実行するとプランキャッシュがすべて消えるのか、また既存のSQL文はすべて再コンパイル対象になるのか疑問に感じる方も多いでしょう。
この記事では、SQL Serverのプランキャッシュの役割、DBCC FREEPROCCACHEで削除される対象、実行後に発生する再コンパイルの仕組みについて詳しく解説します。クエリ性能調査やチューニングを行う際に、正しく理解して利用できるようになることを目的としています。
SQL Serverのプランキャッシュとは
SQL Serverでは、SQL文を実行する際に、そのSQLをどのように処理するかを決める実行計画(クエリプラン)を作成します。この実行計画は、毎回作成すると負荷が高いため、プランキャッシュというメモリ領域に保存されます。
一度作成された実行計画は、同じようなSQLが再実行された場合に再利用されます。そのため、SQL Serverはコンパイル処理の負荷を減らし、高速なクエリ実行を実現しています。
例えば、同じテーブルから同じ条件でデータを取得するSELECT文を何度も実行する場合、毎回実行計画を作り直すのではなく、キャッシュされたプランを利用することで処理速度を向上させています。
DBCC FREEPROCCACHEで削除されるもの
DBCC FREEPROCCACHEを実行すると、SQL Serverのプランキャッシュが削除されます。
つまり、メモリ上に保持されている実行計画が解放され、次回SQL文が実行された際には、新しい実行計画を生成するためのコンパイル処理が必要になります。
例えば、あるストアドプロシージャやSELECT文が以前実行されていても、DBCC FREEPROCCACHE後の最初の実行ではキャッシュされた実行計画が存在しないため、SQL Serverは再度コンパイルを行います。
DBCC FREEPROCCACHEを実行するとすべてのSQLが再コンパイルされるのか
DBCC FREEPROCCACHEを実行すると、既存のプランキャッシュ内の実行計画は削除されます。そのため、削除されたプランを使用していたSQL文は、次回実行時に再コンパイル対象になります。
ただし、DBCC FREEPROCCACHEを実行した瞬間に、サーバー上で使用されているすべてのSQLが一斉に再コンパイルされるわけではありません。
正確には、キャッシュされた実行計画が削除されるため、その後に各SQLが実行されたタイミングで必要に応じてコンパイルされます。つまり、使用されないSQL文まで無駄にコンパイルされることはありません。
DBCC FREEPROCCACHE実行後の動作例
例えば、通常時に次のような流れでSQLが実行されているとします。
1回目のSELECT実行ではSQL Serverが実行計画を作成し、プランキャッシュへ保存します。2回目以降の同じSQLでは、そのキャッシュされた実行計画を利用します。
ここでDBCC FREEPROCCACHEを実行すると、保存されていた実行計画が削除されます。その後、再び同じSELECTを実行すると、SQL Serverは新しい実行計画を作成してから処理を開始します。
このため、DBCC FREEPROCCACHE直後の初回実行では、通常より時間がかかる場合があります。
DBCC FREEPROCCACHEを使用する目的
DBCC FREEPROCCACHEは、主にSQL性能検証や調査目的で利用されます。
例えば、SQLのチューニング前後で処理速度を比較する場合、古い実行計画が残っていると正確な評価ができないことがあります。そのような場合に、プランキャッシュを削除して条件を揃えるために使用されます。
また、実行計画の問題によってSQL Serverの性能が低下している場合、一時的な調査手段として利用されることもあります。
DBCC FREEPROCCACHEを本番環境で実行するときの注意点
DBCC FREEPROCCACHEは便利なコマンドですが、本番環境で不用意に実行することは避けるべきです。
プランキャッシュが削除されると、多くのSQLが再コンパイルされる可能性があります。大量のSQLが同時に実行されているシステムでは、コンパイル処理によるCPU負荷が増加し、一時的な性能低下につながる場合があります。
例えば、大規模な業務システムで営業時間中に実行すると、多数のユーザー操作によるSQLが次々と再コンパイルされ、レスポンス悪化を引き起こす可能性があります。
DBCC FREEPROCCACHEとDBCC DROPCLEANBUFFERSの違い
SQL Serverにはキャッシュを削除する複数のDBCCコマンドがありますが、対象となるキャッシュは異なります。
| コマンド | 削除対象 |
|---|---|
| DBCC FREEPROCCACHE | 実行計画(プランキャッシュ) |
| DBCC DROPCLEANBUFFERS | Buffer Pool内のクリーンなデータページ |
つまり、DBCC FREEPROCCACHEはSQLの実行方法に関するキャッシュを削除し、DBCC DROPCLEANBUFFERSはデータそのものの読み込みキャッシュを削除します。
性能検証では、どちらのキャッシュをリセットしたいのか目的を明確にして使用することが重要です。
まとめ
DBCC FREEPROCCACHEを実行すると、SQL Serverのプランキャッシュに保存されている実行計画が削除されます。
削除された実行計画を利用していたSQL文は、次回実行時に再コンパイルされます。ただし、実行した瞬間にすべてのSQLが一斉に再コンパイルされるわけではなく、必要になったSQLから順番にコンパイルされます。
DBCC FREEPROCCACHEは性能検証では有効なツールですが、本番環境では予期しない負荷増加を招く可能性があります。プランキャッシュの仕組みを理解したうえで、目的と影響範囲を確認して利用することが大切です。


コメント