sys.fn_validate_plan_guide(Transact-SQL)

適用対象:SQL ServerAzure SQL Managed Instance

指定したプラン ガイドの有効性を確認します。 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)。
状態 smallint エラーが発生したコード内の場所を示すエラーの状態番号です。
メッセージ nvarchar(2048) エラーのメッセージ テキスト。

アクセス許可

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

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

解説

sys.fn_validate_plan_guide関数は、Azure SQL Database では使用できません。

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

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

USE AdventureWorks2022;  
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 AdventureWorks2022;  
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  

参照

プラン ガイド
sp_create_plan_guide(Transact-SQL)
sp_create_plan_guide_from_handle(Transact-SQL)