sys.fn_validate_plan_guide (Transact-SQL)
適用於:SQL Server Azure SQL 受控執行個體
驗證指定計劃指南的有效性。 函 sys.fn_validate_plan_guide
式會傳回當計劃指南套用至其查詢時遇到的第一個錯誤訊息。 當計劃指南有效時,會傳回空的數據列集。 在對資料庫的實體設計進行變更之後,計劃指南可能會變成無效。 例如,如果計劃指南指定特定索引,且該索引後續卸除,查詢將無法再使用計劃指南。
藉由驗證計劃指南,您可以判斷優化工具是否可以在不修改的情況下使用指南。 根據函式的結果,您可以決定卸除計劃指南,然後重新調整查詢或修改資料庫設計,例如,重新建立計劃指南中指定的索引。
語法
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 資料庫 中無法使用函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)