適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric の SQL データベース
FORCEPLANがONに設定されている場合、SQL Serverクエリ最適化器は、クエリのFROM節に現れるテーブルと同じ順序でジョインを処理します。 さらに、 FORCEPLAN をONに設定すると、クエリの計画を作成するために他の種類のジョインが必要な場合や、ジョインヒントやクエリヒントで要求された場合を除き、ネストされたループジョインの使用を強制します。
構文
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 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)