sys.fn_validate_plan_guide (Transact-SQL)

指定したプラン ガイドの有効性を確認します。sys.fn_validate_plan_guide 関数では、クエリにプラン ガイドを適用した場合に最初に発生するエラーのメッセージが返されます。プラン ガイドが有効な場合は空の行セットが返されます。プラン ガイドは、データベースの物理デザインが変更されると無効になる場合があります。たとえば、プラン ガイドで特定のインデックスが指定されている場合にそのインデックスが削除されると、クエリでそのプラン ガイドを使用できなくなります。

プラン ガイドを検証することで、変更を加えずにオプティマイザで使用できるかどうかを確認できます。この関数の結果に基づいて、そのプラン ガイドを削除してクエリを再チューニングするか、データベースのデザインを変更する (プラン ガイドで指定されているインデックスを再作成するなど) かを決定できます。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

sys.fn_validate_plan_guide ( plan_guide_id )

引数

  • plan_guide_id
    sys.plan_guides カタログ ビューで報告されるプラン ガイドの ID を指定します。plan_guide_id のデータ型は int で、既定値はありません。

返されるテーブル

列名

データ型

説明

msgnum

int

エラー メッセージの ID です。

severity

tinyint

メッセージの重大度レベルです。有効値は 1 ~ 25 です。

state

smallint

エラーが発生したコード内の場所を示すエラーの状態番号です。

message

nvarchar(2048)

エラー メッセージのテキストです。

権限

スコープが OBJECT のプラン ガイドでは、参照先オブジェクトに対する VIEW DEFINITION 権限または ALTER 権限と、プラン ガイドに含まれるクエリやバッチをコンパイルするための権限が必要です。たとえば、バッチに SELECT ステートメントが含まれている場合は、参照先オブジェクトに対する SELECT 権限が必要です。

スコープが SQL または TEMPLATE のプラン ガイドでは、データベースに対する ALTER 権限と、プラン ガイドに含まれるクエリやバッチをコンパイルするための権限が必要です。たとえば、バッチに SELECT ステートメントが含まれている場合は、参照先オブジェクトに対する SELECT 権限が必要です。

A. データベースのすべてのプラン ガイドを検証する

次の例では、現在のデータベースのすべてのプラン ガイドの有効性を確認します。空の結果セットが返された場合は、すべてのプラン ガイドが有効です。

USE AdventureWorks;
GO
SELECT plan_guide_id, msgnum, severity, state, message
FROM sys.plan_guides
CROSS APPLY fn_validate_plan_guide(plan_guide_id);
GO

B. データベースに変更を実装する前にプラン ガイドを検証する

次の例では、明示的なトランザクションを使用してインデックスを削除します。sys.fn_validate_plan_guide 関数を実行して、この操作によって無効になるプラン ガイドがデータベースにあるかどうかを確認します。この関数の結果に基づいて、DROP INDEX ステートメントがコミットされるか、トランザクションがロールバックされます。トランザクションがロールバックされた場合は、インデックスは削除されません。

USE AdventureWorks;
GO
BEGIN TRANSACTION;
DROP INDEX IX_SalesOrderHeader_CustomerID ON Sales.SalesOrderHeader;
-- Check for invalid plan guides.
IF EXISTS (SELECT plan_guide_id, msgnum, severity, state, message
           FROM sys.plan_guides
           CROSS APPLY sys.fn_validate_plan_guide(plan_guide_id))
    ROLLBACK TRANSACTION;
ELSE
    COMMIT TRANSACTION;
GO