次の方法で共有


sp_control_plan_guide (Transact-SQL)

適用対象: SQL Server

sp_control_plan_guide システム ストアド プロシージャは、プラン ガイドの削除、有効化、無効化に使用されます。

Transact-SQL 構文表記規則

構文

sp_control_plan_guide
    [ @operation = ] { N'DROP [ ALL ]' | N'DISABLE [ ALL ]' | N'ENABLE [ ALL ]' }
    [ , [ @name = ] N'name' ]
[ ; ]

引数

[ @name = ] N'name'

削除するか、有効または無効にするプラン ガイドを指定します。 @namesysname で、既定値は NULL です。 @name は現在のデータベースに解決されます。 指定しない場合、既定@nameNULL

[ @operation = ] { N'DROP [ ALL ]' |N'DISABLE [ ALL ]' |N'ENABLE [ ALL ]' }

@nameで指定されたプラン ガイドに対して実行する操作。 @operationnvarchar(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';