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 目錄檢視中所報告之計畫指南的識別碼。plan_guide_id 為 int,而且沒有預設值。

傳回的資料表

資料行名稱

資料類型

描述

msgnum

int

錯誤訊息的識別碼。

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