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 は現在のデータベースに解決されます。 指定しない場合、既定@nameNULL
。
[ @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
または DROP ALL
オプションを使用してsp_control_plan_guide
を実行できます。
アクセス許可
@type = '<object>'
を指定して作成された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';