SET FORCEPLAN (Transact-SQL)

FORCEPLAN を ON に設定すると、MicrosoftSQL Server クエリ オプティマイザは、クエリの FROM 句のテーブルと同じ順序で結合を処理します。また、FORCEPLAN を ON に設定すると、クエリのプランの構築に他の種類の結合が必要とされる場合や、結合ヒントまたはクエリ ヒントで他の種類の結合が要求された場合を除き、入れ子になったループ結合が強制的に使用されます。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

SET FORCEPLAN { ON | OFF }

説明

SET FORCEPLAN は基本的に、クエリ オプティマイザが Transact-SQL SELECT ステートメントの処理で使用するロジックを変更します。SELECT ステートメントから返されるデータは同じであり、この設定とは無関係です。唯一の違いは、クエリの要求を満たすために、SQL Server がテーブルをどのように処理するかという点です。

クエリ内でクエリ オプティマイザ ヒントを使用することによって、SQL Server の SELECT ステートメントの処理方法を変更することもできます。

SET FORCEPLAN は、解析時ではなく実行時に設定されます。

権限

SET FORCEPLAN の実行権限は、特に指定のない限りすべてのユーザーに与えられます。

次の例では、4 つのテーブルの結合を実行します。SHOWPLAN_TEXT が ON に設定されているので、SET FORCE_PLAN が ON に設定された後、SQL Server は、クエリの処理方法がどのように変更されたかに関する情報を返します。

USE AdventureWorks;
GO
-- Make sure FORCEPLAN is set to OFF.
SET SHOWPLAN_TEXT OFF;
GO
SET FORCEPLAN OFF;
GO
SET SHOWPLAN_TEXT ON;
GO
-- Example where the query plan is not forced.
SELECT c.LastName, c.FirstName, v.Name
FROM Person.Contact AS c
   INNER JOIN HumanResources.Employee AS e
   ON e.ContactID = c.ContactID
   INNER JOIN Purchasing.PurchaseOrderHeader AS poh
   ON e.EmployeeID = poh.EmployeeID
   INNER JOIN Purchasing.Vendor AS v
   ON poh.VendorID = v.VendorID;
GO
-- SET FORCEPLAN to ON.
SET SHOWPLAN_TEXT OFF;
GO
SET FORCEPLAN ON;
GO
SET SHOWPLAN_TEXT ON;
GO
-- Reexecute inner join to see the effect of SET FORCEPLAN ON.
SELECT c.LastName, c.FirstName, v.Name
FROM Person.Contact AS c
   INNER JOIN HumanResources.Employee AS e 
   ON e.ContactID = c.ContactID
   INNER JOIN Purchasing.PurchaseOrderHeader AS poh
   ON e.EmployeeID = poh.EmployeeID
   INNER JOIN Purchasing.Vendor AS v
   ON poh.VendorID = v.VendorID;
GO
SET SHOWPLAN_TEXT OFF;
GO
SET FORCEPLAN OFF;
GO