SQL Serverのキャッシュにクエリ実行プランを保持し、それを数回使用するにはどうすればよいですか?
初めてクエリを実行するとき、7秒かかります。その後、わずか1秒かかります。このクエリは、毎日1回実行されます。
実行計画を保持して毎日使用する方法はありますか?
申し訳ありませんが、プランを強制的にキャッシュに保持することはできません。ただし、いくつかの理由により、クエリがキャッシュからスローされる可能性があります。 実行計画 に関するブログを読んでください。実行計画が無効になる理由がいくつか示されています。
- クエリによって参照されるテーブルの構造またはスキーマを変更する
- クエリで使用されるインデックスの変更
- クエリで使用されるインデックスを削除する
- クエリで使用される統計の更新
- 関数sp_recompileの呼び出し
- クエリによって参照されるテーブルのキーに多数の挿入または削除を行う
- トリガーのあるテーブルの場合、挿入または削除されたテーブルの大幅な増加
- 単一のクエリ内でDDLとDMLを混在させる(しばしば遅延コンパイルと呼ばれる)
- クエリの実行中にSETオプションを変更する
- クエリで使用される一時テーブルの構造またはスキーマを変更する
- クエリで使用される動的ビューの変更
- クエリ内のカーソルオプションの変更
- 分散パーティションビューなどのリモート行セットへの変更
- クライアント側カーソルを使用する場合、FOR BROWSEオプションが変更された場合
もう1つの落とし穴は、クエリが変更されることです。これは、where句が変更され(たとえば、日付でフィルタリングする)、bindを使用しない場合に発生する可能性があります
考えてみて、実行プランがまだキャッシュにあるかどうかをチェックしたとは言いませんでした。キャッシュを照会してそれを把握する必要があります。ただし、クエリは1日に1回しか実行されないと言うので、プランは期限切れになるだけです。 blog は、SQLサーバーがプランをいつ期限切れにするかを決定する方法についての公式に実際に言及しています。
次の基準が満たされると、プランはメモリから削除されます。
- システムにより多くのメモリが必要です
- プランの「年齢」がゼロに達しました
- プランは現在、既存の接続によって参照されていません
一般的に、大きなレポートがある場合、7秒は悪くありません。コーヒーを入れるのに時間がかかります。エンドユーザーにとって6秒の無駄な生産性以外の問題が発生しますか?
おそらく、それをより速くするのは実行計画ではありません。それがデータです。
クエリを実行した後、SQL Serverはデータをキャッシュに保持する場合があります。したがって、情報を取得するためにディスクから読み取る必要はありませんが、RAMから情報を取得できるため、はるかに高速です。
実行プランもプランキャッシュに保存される可能性がありますが、実行プランをコンパイルすると、クエリの実行時間が7倍になることは間違いありません。
プランとデータは、十分に頻繁に使用し、サーバーに「メモリ不足」(物理メモリが少なすぎるため)がない場合、自動的にメモリに残ります。計画やデータをキャッシュに固定したままにすることはできません。メモリが不足している場合は破棄されます。