SQL Server がプラン ガイドをクエリに照合するプロセス
SQL Server は、sp_create_plan_guide ストアド プロシージャの @module_or_batch 引数で指定されたストアド プロシージャ、トリガ、または関数 (モジュール) に含まれているクエリに OBJECT 型のプラン ガイドを照合します。モジュールにプラン ガイドが存在する場合は、そのプラン ガイドが指定のクエリに照合されます。
バッチ内で送信されたクエリの場合は、SQL Server が、まずクエリを SQL ベースのプラン ガイドと照合し、クエリをパラメータ化してから、プラン ガイドとクエリを照合します。次の図に、このプロセスの概要を示します。
- SQL Server クエリ オプティマイザでは、実行されたバッチが、バッチ内の各ステートメントをコンパイルする要求として認識されます。
- バッチ内の特定のステートメントの場合は、SQL Server が、そのステートメントを SQL ベースのプラン ガイドと照合します。このガイドの @module_or_batch 引数は、受け取るバッチ テキスト (定数のリテラル値を含む) の引数と一致し、@stmt 引数もバッチ内のステートメントと一致します。このようなプラン ガイドが存在している場合、照合に成功すると、プラン ガイド内に指定されているクエリ ヒントがステートメント テキストに含められます。さらに、ステートメントがコンパイルされます。
- ステップ 2 で、プラン ガイドをステートメントに照合できなかった場合、SQL Server では強制パラメータ化を使用してステートメントをパラメータ化します。このステップでは、パラメータ化が次のいずれかの理由で失敗することがあります。
- ステートメントが既にパラメータ化されているか、またはステートメントにローカル変数が含まれている。
- PARAMETERIZATION SIMPLE データベースの SET オプションが適用されている (既定の設定) 場合に、TEMPLATE 型のプラン ガイドで、ステートメントに該当し、PARAMETERIZATION FORCED クエリ ヒントを指定したものが存在しない。
- TEMPLATE 型のプラン ガイドで、ステートメントに該当し、PARAMETERIZATION SIMPLE クエリ ヒントを指定したものが存在する。
SQL Server では、強制パラメータ化に成功すると、パラメータ化したステートメントをそのパラメータについて作成された SQL ベースのプラン ガイドに照合します。このようなプラン ガイドが存在している場合、照合に成功すると、プラン ガイド内に指定されているクエリ ヒントを含むようステートメント テキストが変更されます。さらに、ステートメントがコンパイルされます。一致するプラン ガイドが存在しない場合、パラメータ化されたステートメントは、プラン ガイドによって変更されることなくコンパイルされます。
- ステップ 3 でパラメータ化に失敗すると、SQL Server はステートメントのパラメータ化を再試行します。このとき、既定の簡易パラメータ化の動作が適用されます。結果のクエリが直接コンパイルされます。簡易パラメータ化の結果に対するプラン ガイドの照合は行われせん。
メモ : 強制パラメータ化または簡易パラメータ化によってパラメータ化されたステートメントに適用される SQL ベースのプラン ガイドでは、RECOMPILE クエリ ヒントは無視されます。その際、警告が表示されます。
参照
概念
簡易パラメータ化
強制パラメータ化
プラン ガイドを使用した配置済みアプリケーションのクエリの最適化
その他の技術情報
クエリ パフォーマンス
sp_create_plan_guide (Transact-SQL)