SET FORCEPLAN (Transact-SQL)

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL databáze v Microsoft Fabric

Když FORCEPLAN je dotaz nastaven na ON, optimalizátor dotazů SQL Server zpracovává join ve stejném pořadí, v jakém se tabulky objevují v klauzuli FROM dotazu. Navíc nastavení FORCEPLAN na ON vyžaduje použití vnořeného loop join, pokud nejsou potřeba jiné typy spojení pro vytvoření plánu dotazu, nebo pokud nejsou vyžadovány pomocí join hintů či dotazových hintů.

Transact-SQL konvence syntaxe

Syntaxe

  
SET FORCEPLAN { ON | OFF }  

Poznámky

SET FORCEPLAN v podstatě přepisuje logiku používanou optimalizátorem dotazů ke zpracování příkazu SELECT Transact-SQL. Data vrácená příkazem SELECT jsou stejná bez ohledu na toto nastavení. Jediný rozdíl je v tom, jak SQL Server zpracovává tabulky tak, aby vyhověl dotazu.

Náznaky optimalizátoru dotazů lze také použít v dotazech k ovlivnění způsobu, jakým SQL Server zpracovává příkaz SELECT.

SET FORCEPLAN se aplikuje při vykonávání nebo běhu, nikoli při parse.

Povolení

SET FORCEPLAN Oprávnění jsou výchozí pro všechny uživatele.

Examples

Následující příklad provádí spojení čtyř tabulek. Nastavení SHOWPLAN_TEXT je povolené, takže SQL Server po zapnutí tohoto nastavení vrací informace o tom, jak dotaz zpracovává jinak.SET FORCE_PLAN

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  

Viz také

SELECT (Transact-SQL)
SET Příkazy (Transact-SQL)
SET SHOWPLAN_ALL (Transact-SQL)
SET SHOWPLAN_TEXT (Transact-SQL)