同じSQL Server 2005インスタンスで2つのほぼ同一のクエリを実行しています。
- 最初の
SELECT
クエリは、LINQによって生成された元のクエリです(私は知っています、私は知っています...私はアプリケーション開発者ではなく、DBAです:)。 - 2番目のものは最初のものとまったく同じ
OPTION (RECOMPILE)
で、最後にaが追加されています。
他に変更はありません。
最初のものは、実行のたびに55秒かかります。
2番目は2秒かかります。
両方の結果セットは同じです。
このヒントがパフォーマンスの劇的な向上をもたらすのはなぜですか?
Books OnlineのエントリにRECOMPILE
は、あまり詳細な説明はありません。
クエリの実行後にクエリに対して生成されたプランを破棄するようにSQL Serverデータベースエンジンに指示し、同じクエリが次に実行されるときにクエリオプティマイザにクエリプランを再コンパイルさせます。RECOMPILEを指定しないと、データベースエンジンはクエリプランをキャッシュし、それらを再利用します。クエリプランをコンパイルするとき、RECOMPILEクエリヒントは、クエリ内のローカル変数の現在の値を使用し、クエリがストアドプロシージャ内にある場合、現在の値をパラメータに渡します。
RECOMPILEは、ストアドプロシージャ全体ではなく、ストアドプロシージャ内のクエリのサブセットのみを再コンパイルする必要がある場合に、WITH RECOMPILE句を使用するストアドプロシージャを作成するための便利な代替手段です。詳細については、「ストアドプロシージャの再コンパイル」を参照してください。RECOMPILEは、プランガイドを作成するときにも役立ちます。詳細については、「プランガイドを使用したデプロイ済みアプリケーションでのクエリの最適化」を参照してください。
クエリには多くのローカル変数があるため、OPTION (RECOMPILE)
クエリヒントを使用すると、SQL Serverは(真剣に)最適化できると推測されます。
私が見ているところはどこでも、それOPTION (RECOMPILE)
は避けるべきだと言っている。この説明は、一般に、このヒントを使用すると、SQL Serverはこの実行計画を再利用できないため、毎回再コンパイルする時間を無駄にする必要があるというものです。
(しかし)パフォーマンスが非常に優れていることを考えると、今回はこのクエリヒントを使用するのは良いことだと思います。
使用すべきですか?そうでない場合、このヒントとアプリケーションを変更せずに、SQL Serverにより良い実行計画を使用させることができますか?