sys.fn_validate_plan_guide (Transact-SQL)
验证指定计划指南的有效性。 该 sys.fn_validate_plan_guide
函数返回在将计划指南应用于其查询时遇到的第一条错误消息。 如果计划指南有效,则将返回一个空的行集。 在更改了数据库的物理设计后,计划指南可能会变为无效。 例如,如果计划指南指定了特定索引并且随后将该索引删除,则查询将不能再使用该计划指南。
通过验证计划指南,可确定优化器是否能够在不进行修改的情况下直接使用该指南。 例如,基于函数的结果,可决定删除该计划指南并重新调整查询或修改数据库设计(例如,重新创建计划指南中指定的索引)。
语法
sys.fn_validate_plan_guide ( plan_guide_id )
参数
plan_guide_id
sys.plan_guides目录视图中报告的计划指南的 ID。 plan_guide_id不带默认值。
返回的表
列名称 | 数据类型 | 描述 |
---|---|---|
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)