sys.fn_validate_plan_guide (Transact-SQL)

適用於:SQL ServerAzure SQL 受控執行個體

驗證指定計劃指南的有效性。 函 sys.fn_validate_plan_guide 式會傳回當計劃指南套用至其查詢時遇到的第一個錯誤訊息。 當計劃指南有效時,會傳回空的資料列集。 在對資料庫的實體設計進行變更之後,計劃指南可能會變成無效。 例如,如果計劃指南指定特定索引,且該索引後續卸載,查詢將無法再使用計劃指南。

藉由驗證計劃指南,您可以判斷優化工具是否可以在不修改的情況下使用指南。 根據函式的結果,您可以決定卸載計劃指南,然後重新調整查詢或修改資料庫設計,例如,重新建立計劃指南中指定的索引。

Transact-SQL 語法慣例

語法

sys.fn_validate_plan_guide ( plan_guide_id )  

引數

plan_guide_id
這是如sys.plan_guides 目錄檢視中所 報告的計劃指南識別碼。 plan_guide_id為 int ,沒有預設值。

傳回的資料表

資料行名稱 資料類型 描述
msgnum int 錯誤訊息的識別碼。
severity tinyint 訊息的嚴重性層級,介於 1 到 25 之間。
state smallint 錯誤的狀態編號,指出發生錯誤之程式碼中的點。
message Nvarchar(2048) 錯誤的訊息正文。

權限

物件範圍計劃指南需要參考物件的 VIEW DEFINITION 或 ALTER 許可權,以及編譯計劃指南中提供的查詢或批次的許可權。 例如,如果批次包含 SELECT 語句,則需要參考物件的 SELECT 許可權。

SQL 或 TEMPLATE 範圍計劃指南需要資料庫的 ALTER 許可權,以及編譯計劃指南中提供的查詢或批次的許可權。 例如,如果批次包含 SELECT 語句,則需要參考物件的 SELECT 許可權。

備註

Azure SQL Database 中無法使用函 sys.fn_validate_plan_guide 式。

範例

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)