sp_control_plan_guide (Transact-SQL)
适用范围:SQL Server
系统 sp_control_plan_guide
存储过程用于删除、启用或禁用计划指南。
语法
sp_control_plan_guide
[ @operation = ] { N'DROP [ ALL ]' | N'DISABLE [ ALL ]' | N'ENABLE [ ALL ]' }
[ , [ @name = ] N'name' ]
[ ; ]
参数
[ @name = ] N'name'
指定被删除、启用或禁用的计划指南。 @name为 sysname,默认值为 NULL
. @name 解析为当前数据库。 如果未指定, 则@name 默认为 NULL
.
[ = @operation ] { N'DROP [ ALL ]' |N'DISABLE [ ALL ]' |N'ENABLE [ ALL ]' }
针对@name中指定的计划指南执行的操作。 @operation 为 nvarchar(60),没有默认值。
DROP
删除由@name指定的计划指南。 删除计划指南后,以前与计划指南匹配的查询的未来执行不受计划指南的影响。
DROP ALL
删除当前数据库中的所有计划指南。 指定时
DROP ALL
无法指定@name。DISABLE
禁用由@name指定的计划指南。 禁用计划指南后,以前与计划指南匹配的查询的未来执行不受计划指南的影响。
DISABLE ALL
禁用当前数据库中的所有计划指南。 指定时
DISABLE ALL
无法指定@name。ENABLE
启用由@name指定的计划指南。 启用计划指南后,可与符合条件的查询进行匹配。 默认情况下,计划指南在创建时启用。
ENABLE ALL
启用当前数据库中的所有计划指南。 指定时
ENABLE ALL
无法指定@name。
注解
如果尝试删除或修改的函数、存储过程或 DML 触发器由某个计划指南引用,则不管该指南为启用状态还是禁用状态,都会导致错误。
禁用一个已禁用的计划指南或启用一个已启用的计划指南将不起作用,且运行时没有错误。
计划指南在 SQL Server 的每个版本中都不可用。 有关 SQL Server 各个版次支持的功能列表,请参阅 SQL Server 2022 的各个版次及其支持的功能。 但是,可以在任何版本的 SQL Server 中使用或DROP ALL
选项执行sp_control_plan_guide
DROP
。
权限
在类型OBJECT
(已创建指定)@type = '<object>'
的计划指南上执行sp_control_plan_guide
需要ALTER
对计划指南引用的对象具有权限。 所有其他计划指南都需要 ALTER DATABASE
权限。
示例
A. 启用、禁用和删除计划指南
以下示例创建一个计划指南,然后禁用、启用该计划指南并将其删除。
--Create a procedure on which to define the plan guide.
IF OBJECT_ID(N'Sales.GetSalesOrderByCountry', N'P') IS NOT NULL
DROP PROCEDURE Sales.GetSalesOrderByCountry;
GO
CREATE PROCEDURE Sales.GetSalesOrderByCountry (@Country NVARCHAR(60))
AS
BEGIN
SELECT *
FROM Sales.SalesOrderHeader AS h
INNER JOIN Sales.Customer AS c
ON h.CustomerID = c.CustomerID
INNER JOIN Sales.SalesTerritory AS t
ON c.TerritoryID = t.TerritoryID
WHERE t.CountryRegionCode = @Country;
END
GO
--Create the plan guide.
EXEC sp_create_plan_guide N'Guide3',
N'SELECT *
FROM Sales.SalesOrderHeader AS h
INNER JOIN Sales.Customer AS c
ON h.CustomerID = c.CustomerID
INNER JOIN Sales.SalesTerritory AS t
ON c.TerritoryID = t.TerritoryID
WHERE t.CountryRegionCode = @Country',
N'OBJECT',
N'Sales.GetSalesOrderByCountry',
NULL,
N'OPTION (OPTIMIZE FOR (@Country = N''US''))';
GO
--Disable the plan guide.
EXEC sp_control_plan_guide N'DISABLE',
N'Guide3';
GO
--Enable the plan guide.
EXEC sp_control_plan_guide N'ENABLE',
N'Guide3';
GO
--Drop the plan guide.
EXEC sp_control_plan_guide N'DROP',
N'Guide3';
GO
B. 禁用当前数据库中的所有计划指南
以下示例禁用 AdventureWorks2022
数据库中的所有计划指南。
USE AdventureWorks2022;
GO
EXEC sp_control_plan_guide N'DISABLE ALL';