SET FORCEPLAN (Transact-SQL)
Wenn FORCEPLAN auf ON festgelegt wird, verarbeitet der SQL Server-Abfrageoptimierer einen Join in der Reihenfolge, in der die Tabellen in der FROM-Klausel einer Abfrage aufgeführt sind. Darüber hinaus wird durch Festlegen von FORCEPLAN auf ON die Verwendung eines Nested Loops-Joins erzwungen, sofern nicht andere Jointypen zum Erstellen eines Plans für die Abfrage erforderlich sind oder durch Join- bzw. Abfragehinweise angefordert werden.
Syntax
SET FORCEPLAN { ON | OFF }
Hinweise
SET FORCEPLAN setzt die Logik außer Kraft, die der Abfrageoptimierer beim Verarbeiten einer Transact-SQL-SELECT-Anweisung verwendet. 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ührungszeit und nicht zur Analysezeit angewendet.
Berechtigungen
Die SET FORCEPLAN-Berechtigungen erhalten standardmäßig alle Benutzer.
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 AdventureWorks2008R2;
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