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 目录视图中 报告的计划指南的 ID。 plan_guide_idint ,无默认值。

返回的表

列名称 数据类型 说明
msgnum int 错误消息的 ID。
severity tinyint 消息的严重级别,在 1 到 25 之间。
state smallint 错误的状态号,用于指示发生错误的代码位置。
message nvarchar(2048) 错误的消息正文。

权限

OBJECT 作用域的计划指南要求对被引用的对象具有 VIEW DEFINITION 或 ALTER 权限,并要求具有编译计划指南中提供的查询或批处理的权限。 例如,如果批处理包含 SELECT 语句,则需要具有对被引用对象的 SELECT 权限。

SQL 或 TEMPLATE 作用域的计划指南要求对数据库具有 ALTER 权限,并要求具有编译计划指南中提供的查询或批处理的权限。 例如,如果批处理包含 SELECT 语句,则需要具有对被引用对象的 SELECT 权限。

备注

函数sys.fn_validate_plan_guide在 Azure SQL 数据库中不可用。

示例

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)