sys.fn_validate_plan_guide (Transact-SQL)
验证指定计划指南的有效性。 sys.fn_validate_plan_guide 函数返回计划指南应用于其查询时遇到的第一条错误消息。 如果计划指南有效,则将返回一个空的行集。 在更改了数据库的物理设计后,计划指南可能会变为无效。 例如,如果计划指南指定了特定索引并且随后将该索引删除,则查询将不能再使用该计划指南。
通过验证计划指南,可确定优化器是否能够在不进行修改的情况下直接使用该指南。 例如,基于函数的结果,可决定删除该计划指南并重新调整查询或修改数据库设计(例如,重新创建计划指南中指定的索引)。
语法
sys.fn_validate_plan_guide ( plan_guide_id )
返回的表
列名 |
数据类型 |
说明 |
---|---|---|
msgnum |
int |
错误消息的 ID。 |
严重性 |
tinyint |
消息的严重级别,介于 1 和 25 之间。 |
状态 |
smallint |
错误的状态号,用于指示发生错误的代码位置。 |
消息 |
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