SET FORCEPLAN (Transact-SQL)
適用対象: SQL Server
Azure SQL Database
Azure SQL Managed Instance
FORCEPLAN を ON に設定すると、SQL Server クエリ オプティマイザーは、クエリの FROM 句のテーブルと同じ順序で結合を処理します。 また、FORCEPLAN を ON に設定すると、クエリのプランの構築に他の種類の結合が必要とされる場合や、結合ヒントまたはクエリ ヒントで他の種類の結合が要求された場合を除き、入れ子になったループ結合が強制的に使用されます。
構文
SET FORCEPLAN { ON | OFF }
Note
SQL Server 2014 (12.x) 以前のバージョンの Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。
解説
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 AdventureWorks2022;
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 p.LastName, p.FirstName, v.Name
FROM Person.Person AS p
INNER JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = p.BusinessEntityID
INNER JOIN Purchasing.PurchaseOrderHeader AS poh
ON e.BusinessEntityID = poh.EmployeeID
INNER JOIN Purchasing.Vendor AS v
ON poh.VendorID = v.BusinessEntityID;
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 p.LastName, p.FirstName, v.Name
FROM Person.Person AS p
INNER JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = p.BusinessEntityID
INNER JOIN Purchasing.PurchaseOrderHeader AS poh
ON e.BusinessEntityID = poh.EmployeeID
INNER JOIN Purchasing.Vendor AS v
ON poh.VendorID = v.BusinessEntityID;
GO
SET SHOWPLAN_TEXT OFF;
GO
SET FORCEPLAN OFF;
GO
参照
SELECT (Transact-SQL)
SET ステートメント (Transact-SQL)
SET SHOWPLAN_ALL (Transact-SQL)
SET SHOWPLAN_TEXT (Transact-SQL)