SQL Server では、「OPTION (RECOMPILE)」のクエリヒントを使用することで、明示的に SQL ステートメントをリコンパイルすることができます。
パラメータースニフィングにより、パラメーターを使用したクエリで、実行タイミングによって大きく件数が変わる場合などに、コンパイルによる再利用効率とのトレードオフを考慮してクエリヒントをケースが多いと思いますが、それ以外でも RECOMPILE のヒントによって動作が変更されるケースがあります。
RECOMPILE の説明には次のような記載があります。
RECOMPILE
SQL Server データベース エンジン に、クエリの新しい一時的なプランを生成し、クエリ実行完了直後にそのプランを破棄するよう指示します。 生成されたクエリ プランは、RECOMPILE ヒントを指定しないで同じクエリを実行したときにキャッシュに格納されるプランを置き換えません。 RECOMPILE を指定しない場合、データベース エンジンはクエリ プランをキャッシュして再利用します。 クエリ プランをコンパイルする場合、RECOMPILE クエリ ヒントは、クエリ内のローカル変数の現在値を使用します。 クエリがストアド プロシージャ内にある場合は、任意のパラメーターに渡された現在値を使用します。
ポイントとなるのが「クエリ プランをコンパイルする場合、RECOMPILE クエリ ヒントは、クエリ内のローカル変数の現在値を使用します。 クエリがストアド プロシージャ内にある場合は、任意のパラメーターに渡された現在値を使用します。」の個所ですね。
この辺の動作をすっかり忘れていて、処理時間に大きく影響が出たクエリを作ってしまったので、実際のクエリをベースに確認していきます。
Read the rest of this entry »