SQL Server がプラン ガイドをクエリに照合するプロセス

SQL Server は、sp_create_plan_guide ストアド プロシージャの @module_or_batch 引数で指定されたストアド プロシージャ、トリガ、または関数 (モジュール) に含まれているクエリに OBJECT 型のプラン ガイドを照合します。モジュールにプラン ガイドが存在する場合は、そのプラン ガイドが指定のクエリに照合されます。

バッチ内で送信されたクエリの場合は、SQL Server が、まずクエリを SQL ベースのプラン ガイドと照合し、クエリをパラメータ化してから、プラン ガイドとクエリを照合します。次の図に、このプロセスの概要を示します。

SQL Server がプラン ガイドをクエリに照合するプロセス

  1. SQL Server クエリ オプティマイザでは、実行されたバッチが、バッチ内の各ステートメントをコンパイルする要求として認識されます。

  2. バッチ内の特定のステートメントの場合は、SQL Server が、そのステートメントを SQL ベースのプラン ガイドと照合します。このガイドの @module_or_batch 引数は、受け取るバッチ テキスト (定数のリテラル値を含む) の引数と一致し、@stmt 引数もバッチ内のステートメントと一致します。このようなプラン ガイドが存在している場合、照合に成功すると、プラン ガイド内に指定されているクエリ ヒントがステートメント テキストに含められます。さらに、ステートメントがコンパイルされます。

  3. ステップ 2 で、プラン ガイドをステートメントに照合できなかった場合、SQL Server では強制パラメータ化を使用してステートメントをパラメータ化します。このステップでは、パラメータ化が次のいずれかの理由で失敗することがあります。

    1. ステートメントが既にパラメータ化されているか、またはステートメントにローカル変数が含まれている。

    2. PARAMETERIZATION SIMPLE データベースの SET オプションが適用されている (既定の設定) 場合に、TEMPLATE 型のプラン ガイドで、ステートメントに該当し、PARAMETERIZATION FORCED クエリ ヒントを指定したものが存在しない。

    3. TEMPLATE 型のプラン ガイドで、ステートメントに該当し、PARAMETERIZATION SIMPLE クエリ ヒントを指定したものが存在する。

    SQL Server では、強制パラメータ化に成功すると、パラメータ化したステートメントをそのパラメータについて作成された SQL ベースのプラン ガイドに照合します。このようなプラン ガイドが存在している場合、照合に成功すると、プラン ガイド内に指定されているクエリ ヒントを含むようステートメント テキストが変更されます。さらに、ステートメントがコンパイルされます。一致するプラン ガイドが存在しない場合、パラメータ化されたステートメントは、プラン ガイドによって変更されることなくコンパイルされます。

  4. ステップ 3 でパラメータ化に失敗すると、SQL Server はステートメントのパラメータ化を再試行します。このとき、既定の簡易パラメータ化の動作が適用されます。結果のクエリが直接コンパイルされます。簡易パラメータ化の結果に対するプラン ガイドの照合は行われせん。

    注意

    強制パラメータ化または簡易パラメータ化によってパラメータ化されたステートメントに適用される SQL ベースのプラン ガイドでは、RECOMPILE クエリ ヒントは無視されます。その際、警告が表示されます。