sys.fn_validate_plan_guide (Transact-SQL)
確認指定之計畫指南的有效性。 當計畫指南套用到其查詢時,sys.fn_validate_plan_guide 函數會傳回所發生的第一個錯誤訊息。 當計畫指南有效時,會傳回空的資料列集。 當資料庫的實體設計變更後,計畫指南可能變成無效。 例如,如果計畫指南指定特定的索引,而且該索引接著遭到卸除,查詢將無法再使用該計畫指南。
您可以藉由驗證計畫指南,判斷最佳化工具是否可在不進行任何修改的情況下使用該指南。 根據函數的結果,您可以決定卸除計畫指南,然後藉由諸如重新建立計畫指南中指定之索引的方式,傳回查詢或修改資料庫設計。
適用於:SQL Server (SQL Server 2008 至目前版本)。 |
語法
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 AdventureWorks2012;
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 AdventureWorks2012;
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)