Delen via


SET FORCEPLAN (Transact-SQL)

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-database in Microsoft Fabric

Wanneer FORCEPLAN op AAN staat, verwerkt de SQL Server-queryoptimizer een join in dezelfde volgorde als de tabellen in de FROM-clausule van een query. Daarnaast dwingt het instellen van FORCEPLAN op ON het gebruik van een geneste lus-join af, tenzij andere soorten joins nodig zijn om een plan voor de query te maken, of ze worden gevraagd met join-hints of query-hints.

Transact-SQL syntaxis-conventies

Syntaxis

  
SET FORCEPLAN { ON | OFF }  

Opmerkingen

SET FORCEPLAN overschrijft in wezen de logica die door de query-optimizer wordt gebruikt om een Transact-SQL SELECT-instructie te verwerken. De gegevens die door de SELECT-instructie worden teruggegeven, zijn ongeacht deze instelling hetzelfde. Het enige verschil is de manier waarop SQL Server de tabellen verwerkt om aan de query te voldoen.

Query optimizer hints kunnen ook in queries worden gebruikt om te beïnvloeden hoe SQL Server de SELECT-instructie verwerkt.

SET FORCEPLAN wordt toegepast tijdens uitvoeren of uitvoering en niet tijdens parsetijd.

Permissions

STEL FORCEPLAN-rechten standaard in op alle gebruikers.

Voorbeelden

Het volgende voorbeeld voert een join uit van vier tabellen. De SHOWPLAN_TEXT instelling is ingeschakeld, dus SQL Server geeft informatie terug over hoe het de query anders verwerkt nadat de SET FORCE_PLAN instelling is ingeschakeld.

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  

Zie ook

SELECT (Transact-SQL)
SET-instructies (Transact-SQL)
SET SHOWPLAN_ALL (Transact-SQL)
SET SHOWPLAN_TEXT (Transact-SQL)