SET FORCEPLAN (Transact-SQL)

Gilt für:SQL ServerAzure SQL-DatenbankVerwaltete Azure SQL-InstanzSQL-Datenbank in Microsoft Fabric

Wenn FORCEPLAN auf ON gesetzt ist, verarbeitet der SQL Server-Abfrageoptimierer einen Join in derselben Reihenfolge, in der die Tabellen in der FROM-Klausel einer Abfrage erscheinen. Zusätzlich erzwingt die Einstellung FORCEPLAN auf ON die Verwendung eines verschachtelten Loop-Joins, es sei denn, es sind andere Arten von Joins erforderlich, um einen Plan für die Abfrage zu erstellen, oder sie werden mit Join-Hinweisen oder Abfragehinweisen angefordert.

Transact-SQL-Syntaxkonventionen

Syntax

  
SET FORCEPLAN { ON | OFF }  

Hinweise

SET FORCEPLAN überschreibt im Wesentlichen die vom Abfrageoptimierer verwendete Logik zur Verarbeitung einer Transact-SQL SELECT-Anweisung. Die SELECT-Anweisung gibt unabhängig von dieser Einstellung dieselben Daten zurück. Der einzige Unterschied besteht darin, wie SQL Server die Tabellen bei der Ausführung der Abfrage verarbeitet.

Auch Hinweise für den Abfrageoptimierer können in Abfragen verwendet werden, um das Verarbeiten der SELECT-Anweisung durch SQL Server zu beeinflussen.

SET FORCEPLAN wird zur Ausführungs- oder Laufzeit angewendet und nicht zur Parsezeit.

Berechtigungen

SET FORCEPLAN Berechtigungen sind standardmäßig auf alle Benutzer beschränkt.

Beispiele

Im folgenden Beispiel werden vier Tabellen verknüpft. Die SHOWPLAN_TEXT-Einstellung ist aktiviert. Daher gibt SQL Server Informationen dazu zurück, wie die Abfrage anders verarbeitet wird, sobald die SET FORCE_PLAN-Einstellung aktiviert wird.

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  

Weitere Informationen

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