次の方法で共有


プラン ガイドのデザインと実装

更新 : 2007 年 9 月 15 日

クエリのテキストを直接変更できない場合や、変更することが望ましくない場合に、プラン ガイドを使用して、クエリのパフォーマンスを最適化できます。プラン ガイドを作成すると、次のコンテキストで実行されるクエリを照合できます。

  • OBJECT プラン ガイドでは、Transact-SQL ストアド プロシージャ、スカラ関数、複数ステートメント テーブル値関数、および DML トリガのコンテキストで実行されるクエリが照合されます。
  • SQL プラン ガイドでは、データベース オブジェクトの一部ではないスタンドアロン Transact-SQL ステートメントとスタンドアロン バッチのコンテキストで実行されるクエリが照合されます。また、SQL ベースのプラン ガイドを使用して、指定した形式にパラメータ化されたクエリを照合することもできます。
  • TEMPLATE プラン ガイドでは、指定した形式にパラメータ化されたスタンドアロン クエリが照合されます。これらのプラン ガイドは、クエリのクラスのデータベースの現在の PARAMETERIZATION データベース SET オプションを上書きするために使用されます。
ms189854.note(ja-jp,SQL.90).gifメモ :
プラン ガイドを使用できるのは SQL Server 2005 Standard、Developer、Evaluation、および Enterprise Edition だけですが、プラン ガイドはどのエディションでも表示できます。また、プラン ガイドを含むデータベースは、どのエディションに対してもアタッチできます。アップグレード済みのバージョンの SQL Server 2005 にデータベースを復元またはアタッチした場合、プラン ガイドはまったく影響を受けません。サーバーのアップグレード後に、各データベース内のプラン ガイドが適切かどうかを確認する必要があります。

@type = N'SQL' または @type = N'TEMPLATE'sp_create_plan_guide ステートメントで指定する SQL ベースのプラン ガイドまたは TEMPLATE ベースのプラン ガイドでは、SQL Server により、@module_or_batch 引数と @params 引数の値が文字単位で比較されてクエリと照合されます。つまり、SQL Server で受け取られる実際のバッチ テキストと厳密に同じテキストを指定する必要があります。実際のバッチ テキストは、SQL Server Profiler を使用してキャプチャすることができます。一般に、クエリがプラン ガイドと照合されているかどうかを確認するには、SQL Server Profiler を使用してプラン ガイドをテストする必要があります。SQL Server Management Studio でバッチを実行して SQL ベースのプラン ガイドまたは TEMPLATE ベースのプラン ガイドをテストすると、予想外の結果になることがあります。詳細については、「SQL Server Profiler を使用したプラン ガイドの作成とテスト」を参照してください。

ms189854.note(ja-jp,SQL.90).gifメモ :
プラン ガイドの作成対象のステートメントを含むバッチには、USE database ステートメントを含めることはできません。

@type = 'SQL' で、@module_or_batch が NULL に設定されている場合、@module_or_batch の値は、@stmt の値に設定されます。つまり、statement_text の値を、SQL Server に送信するときとまったく同じ形式で、同じ文字で指定する必要があります。この適合を容易にするために内部変換は実行されません。

プラン ガイドの範囲は、そのガイドが作成されているデータベースです。したがって、クエリの実行時に使用されているデータベース内に存在するプラン ガイドだけをクエリと照合できます。たとえば、AdventureWorks が現在のデータベースの場合に次のクエリを実行するとします。

SELECT * FROM Person.Contact

この場合、AdventureWorks データベース内のプラン ガイドだけがこのクエリと照合されます。

ただし、AdventureWorks が現在のデータベースの場合に、次のステートメントを実行すると結果が異なります。

USE DB1;
GO
SELECT * FROM Person.Contact;

この場合、DB1 のコンテキストでこのクエリが実行されているので、DB1 内のプラン ガイドがこのクエリと照合されます。

クエリ ヒントは、有効なものであれば、任意の組み合わせでプラン ガイドに使用できます。プラン ガイドをクエリと照合する際、コンパイルや最適化が行われる前に、プラン ガイドで指定されている OPTION 句がクエリに追加されます。プラン ガイドと照合するクエリで既に OPTION 句が使用されている場合、クエリ内のクエリ ヒントがプラン ガイドで指定されているクエリ ヒントに置換されます。ただし、既に OPTION 句が使用されているクエリと照合するプラン ガイドでは、sp_create_plan_guide ステートメントで照合するクエリのテキストを指定するときに、そのクエリの OPTION 句を含める必要があります。プラン ガイドで指定したヒントでクエリに既に存在するヒントを置換せず、追加する場合は、プラン ガイドでは、既存のヒントと追加するヒントの両方を指定する必要があります。

作成できるプラン ガイドの総数の上限は、使用可能なシステム リソースによって決まります。ただし、プラン ガイドは、個々のクエリのパフォーマンスの向上と安定化を図る目的にのみ使用し、その使用は慎重に検討する必要があります。プラン ガイドの使用により配置済みのアプリケーションのクエリ負荷の多くが影響を受けることがないようにしてください。特に、USE PLAN クエリ ヒントを適用するプラン ガイドでは、対象のクエリに固定プランが適用されます。そのため、クエリ オプティマイザでは、そのクエリのプランを、統計やインデックスの変更に合わせて変更できなくなります。

USE PLAN クエリを使用するプラン ガイドを検討する場合は、固定プランを利用する利点と、データ分布や使用可能なインデックスの変更に合わせてプランが自動的に変更されない点を比較検討してください。

アプリケーションを新しい SQL Server のリリースにアップグレードした場合は、プラン ガイドの定義を再評価し、テストすることをお勧めします。新しいリリースでは、パフォーマンス チューニングの要件とプラン ガイドの照合動作が異なる場合があります。

プラン キャッシュに対するプラン ガイドの効果

モジュールでプラン ガイドを作成すると、そのモジュールのクエリ プランがプラン キャッシュから削除されます。バッチで OBJECT 型または SQL 型のプラン ガイドを作成すると、同じハッシュ値を持つバッチのクエリ プランが削除されます。TEMPLATE 型のプラン ガイドを作成すると、そのデータベース内のプラン キャッシュから単一ステートメントのすべてのバッチが削除されます。

プラン ガイドを作成するには

プラン ガイドを無効化、再有効化、または削除するには

現在のデータベース内のプラン ガイドの情報を取得するには

参照

概念

プラン ガイドを使用した配置済みアプリケーションのクエリの最適化

その他の技術情報

クエリ パフォーマンス

ヘルプおよび情報

SQL Server 2005 の参考資料の入手

変更履歴

リリース 履歴

2007 年 9 月 15 日

変更内容 :
  • @type = 'SQL' で、@module_or_batch が NULL に設定されている場合の、statement_text に対するプラン ガイド照合要件を明記しました。
  • プラン ガイドの作成がプラン キャッシュに及ぼす影響についての情報を追加しました。