新しいプラン ガイドの作成

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

プラン ガイドは、クエリ ヒントまたは固定クエリ プランをクエリにアタッチすることにより、クエリの最適化を促します。 プラン ガイドでは、最適化するステートメントと、使用するクエリ ヒントを含む OPTION 句 またはクエリの最適化に使用する特定のクエリ プランのいずれかを指定します。 クエリが実行されると、クエリ オプティマイザーにより Transact-SQL ステートメントがプラン ガイドと照合され、実行時にクエリに OPTION 句がアタッチされるか、指定されたクエリ プランが使用されます。

プラン ガイドは固定クエリ プランまたはクエリ ヒントをクエリに適用します。

制限事項と制約事項

  • sp_create_plan_guide の引数は、表示される順序で指定する必要があります。 sp_create_plan_guideのパラメーターに値を指定する場合、パラメーター名はすべて明示的に指定するか、すべて指定しないかのいずれかにする必要があります。 たとえば、@name = を指定する場合は、@stmt =@type = なども指定する必要があります。 同様に、@name = を省略してパラメーター値だけを指定する場合は、その他のパラメーター名も省略し、値だけを指定する必要があります。 引数の名前は、構文を理解しやすくするための説明目的のものです。 SQL Serverでは、指定したパラメーター名と、その名前が使用されている位置にあるパラメーターの名前が一致しているかどうかは確認されません。

  • 同一のクエリとバッチまたはモジュールに対し、複数の OBJECT または SQL プラン ガイドを作成できます。 ただし、有効にできるプラン ガイドは常に 1 つだけです。

  • @module_or_batch 値で参照するストアド プロシージャ、関数、または DML トリガーが、WITH ENCRYPTION 句を指定するものであるか一時的なものである場合、この値に対して OBJECT 型のプラン ガイドは作成できません。

  • 有効、無効にする場合のどちらでも、そのプラン ガイドで参照されている関数、ストアド プロシージャ、または DML トリガーを削除または変更しようとすると、エラーが発生します。 プラン ガイドで参照され、トリガーが定義されているテーブルを削除しようとする場合もエラーが発生します。

アクセス許可

OBJECT 型のプラン ガイドを作成するには、参照先オブジェクトに対する ALTER 権限が必要です。 SQL または TEMPLATE タイプのプラン ガイドを作成するには、現在のデータベースに対する ALTER 権限が必要です。

SSMS を使用してプラン ガイドを作成する

  1. プラス記号をクリックして、作成するプラン ガイドのあるデータベースを展開し、プラス記号をクリックして [プログラミング] フォルダーを展開します。

  2. [プラン ガイド] フォルダーを右クリックし、[新しいプラン ガイド]...をクリックします。select_plan_guide

  3. [新しいプラン ガイド] ダイアログ ボックスの [名前] ボックスに、プラン ガイドの名前を入力します。

  4. [ステートメント] ボックスに、プラン ガイドの適用対象の Transact-SQL ステートメントを入力します。

  5. [スコープの種類] ボックスの一覧で、 Transact-SQL ステートメントが存在するエンティティの種類を選択します。 これは Transact-SQL ステートメントとプラン ガイドを照合するコンテキストを示します。 選択できる値は、 OBJECTSQL、および TEMPLATEです。

  6. [スコープのバッチ] ボックスに、 Transact-SQL ステートメントを含むバッチ テキストを入力します。 バッチ テキストには、USEdatabase ステートメントを含めることはできません。 [スコープのバッチ] ボックスは、スコープの種類として [SQL] を選択した場合にのみ利用できます。 スコープの種類が SQL であるとき、[スコープのバッチ] ボックスに何も入力しなかった場合、バッチ テキストの値は、 [ステートメント] ボックスと同じ値に設定されます。

  7. [スコープのスキーマ名] ボックスに、対象のオブジェクトを含んでいるスキーマの名前を入力します。 [スコープのスキーマ名] ボックスは、スコープの種類として [オブジェクト] を選択した場合にのみ利用できます。

  8. [スコープのオブジェクト名] ボックスに、 Transact-SQL ステートメントを含む Transact-SQL ストアド プロシージャ、ユーザー定義スカラー関数、複数ステートメントのテーブル値関数、または DML トリガーの名前を入力します。 [スコープのオブジェクト名] ボックスは、スコープの種類として [オブジェクト] を選択した場合にのみ利用できます。

  9. Transact-SQL ステートメントに埋め込まれているすべてのパラメーターの名前とデータ型を [パラメーター] ボックスに入力します。

    パラメーターは、次の条件のいずれかを満たす場合にのみ適用されます。

    • スコープの種類が SQL または TEMPLATEの場合。 TEMPLATEの場合、パラメーターを NULL にすることはできません。

    • Transact-SQL ステートメントが sp_executesql を使用して送信され、パラメーターの値が指定されている場合、または SQL Server が内部でステートメントをパラメーター化した後に送信する場合。

  10. Transact-SQL ステートメントに適用されるクエリ ヒントまたはクエリ プランを [ヒント] ボックスに入力します。 1 つまたは複数のクエリ ヒントを指定するには、有効な OPTION 句を入力します。

  11. [OK] をクリックします。

plan_guide

T-SQL を使用してプラン ガイドを作成する

  1. オブジェクト エクスプローラーで、 データベース エンジンのインスタンスに接続します。

  2. [標準] ツール バーの [新しいクエリ] をクリックします。

  3. 次の例をコピーしてクエリ ウィンドウに貼り付け、 [実行] をクリックします。

    -- creates a plan guide named Guide1 based on a SQL statement  
    EXEC sp_create_plan_guide   
        @name = N'Guide1',   
        @stmt = N'SELECT TOP 1 *   
                  FROM Sales.SalesOrderHeader   
                  ORDER BY OrderDate DESC',   
        @type = N'SQL',  
        @module_or_batch = NULL,   
        @params = NULL,   
        @hints = N'OPTION (MAXDOP 1)';  
    
    

詳細については、「sp_create_plan_guide (Transact-SQL)」を参照してください。