sys.fn_validate_plan_guide (Transact-SQL)
確認指定之計畫指南的有效性。當計畫指南套用到其查詢時,sys.fn_validate_plan_guide 函數會傳回所發生的第一個錯誤訊息。當計畫指南有效時,會傳回空的資料列集。當資料庫的實體設計變更後,計畫指南可能變成無效。例如,如果計畫指南指定特定的索引,而且該索引接著遭到卸除,查詢將無法再使用該計畫指南。
您可以藉由驗證計畫指南,判斷最佳化工具是否可在不進行任何修改的情況下使用該指南。根據函數的結果,您可以決定卸除計畫指南,然後藉由諸如重新建立計畫指南中指定之索引的方式,傳回查詢或修改資料庫設計。
語法
sys.fn_validate_plan_guide ( plan_guide_id )
傳回的資料表
資料行名稱 |
資料類型 |
描述 |
---|---|---|
msgnum |
int |
錯誤訊息的識別碼。 |
severity |
tinyint |
訊息的嚴重性層級,介於 1 至 25 之間。 |
state |
smallint |
錯誤的狀態碼,可指出程式碼中的錯誤發生點。 |
message |
nvarchar(2048) |
錯誤的訊息文字。 |
權限
OBJECT 範圍的計畫指南需要所參考物件的 VIEW DEFINITION 或 ALTER 權限,以及編譯計畫指南中所提供之查詢或批次的權限。例如,如果批次包含 SELECT 陳述式,就會需要所參考物件的 SELECT 權限。
SQL 或 TEMPLATE 範圍的計畫指南需要資料庫的 ALTER 權限,以及編譯計畫指南中所提供之查詢或批次的權限。例如,如果批次包含 SELECT 陳述式,就會需要所參考物件的 SELECT 權限。
範例
A. 驗證資料庫中的所有計畫指南
下列範例會檢查目前資料庫中,所有計畫指南的有效性。如果傳回空的結果集,則所有計畫指南都有效。
USE AdventureWorks2008R2;
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 AdventureWorks2008R2;
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