SET FORCEPLAN (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-databas i Microsoft Fabric

När FORCEPLAN är inställd på ON bearbetar SQL Server-frågeoptimeraren en join i samma ordning som tabellerna förekommer i FROM-klausulen i en fråga. Dessutom tvingar inställningen av FORCEPLAN till ON användning av en nästlad loop-join, om inte andra typer av joins krävs för att konstruera en plan för frågan, eller om de begärs med join-hints eller frågeledtrådar.

Transact-SQL syntaxkonventioner

Syntax

  
SET FORCEPLAN { ON | OFF }  

Anmärkningar

SET FORCEPLAN åsidosätter i princip logiken som används av frågeoptimeraren för att bearbeta ett uttalande Transact-SQL SELECT. Datan som returneras av SELECT-satsen är densamma oavsett denna inställning. Den enda skillnaden är hur SQL Server bearbetar tabellerna för att uppfylla frågan.

Frågeoptimerartips kan också användas i frågor för att påverka hur SQL Server bearbetar SELECT-satsen.

SET FORCEPLAN tillämpas vid exekverings- eller körningstid och inte vid parsetid.

Permissions

SÄTT FORCEPLAN-behörigheter som standard till alla användare.

Examples

Följande exempel utför en sammanfogning av fyra tabeller. Inställningen SHOWPLAN_TEXT är aktiverad, så SQL Server returnerar information om hur den behandlar frågan annorlunda efter att inställningen SET FORCE_PLAN är aktiverad.

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  

Se även

SELECT (Transact-SQL)
SET-instruktioner (Transact-SQL)
SET SHOWPLAN_ALL (Transact-SQL)
STÄLL SHOWPLAN_TEXT (Transact-SQL)