SET FORCEPLAN (Transact-SQL)
Quando FORCEPLAN è impostato su ON, Query Optimizer di MicrosoftSQL Server elabora un join nello stesso ordine delle tabelle nella clausola FROM di una query. L'impostazione di FORCEPLAN su ON determina inoltre l'utilizzo forzato di un nested loop join, a meno che altri tipi di join non siano necessari per la costruzione di un piano per la query o siano richiesti con hint di join o hint per la query.
Sintassi
SET FORCEPLAN { ON | OFF }
Osservazioni
L'opzione SET FORCEPLAN sostanzialmente sostituisce la logica utilizzata in Query Optimizer per l'elaborazione di un'istruzione SELECT Transact-SQL. I dati restituiti dall'istruzione SELECT sono gli stessi, indipendentemente dall'impostazione. L'unica differenza è la modalità in cui SQL Server elabora le tabelle per soddisfare la query.
È inoltre possibile utilizzare gli hint di Query Optimizer in query che hanno effetto sulla modalità di elaborazione dell'istruzione SELECT in SQL Server.
L'opzione SET FORCEPLAN viene applicata in fase di esecuzione, non in fase di analisi.
Autorizzazioni
Le autorizzazioni per l'opzione SET FORCEPLAN vengono assegnate per impostazione predefinita a tutti gli utenti.
Esempi
Nell'esempio seguente viene eseguito il join di quattro tabelle. L'impostazione dell'opzione SHOWPLAN_TEXT è attivata in modo che SQL Server restituisca le informazioni sulla diversa modalità di elaborazione della query dopo l'attivazione di SET FORCE_PLAN.
USE AdventureWorks;
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 c.LastName, c.FirstName, v.Name
FROM Person.Contact AS c
INNER JOIN HumanResources.Employee AS e
ON e.ContactID = c.ContactID
INNER JOIN Purchasing.PurchaseOrderHeader AS poh
ON e.EmployeeID = poh.EmployeeID
INNER JOIN Purchasing.Vendor AS v
ON poh.VendorID = v.VendorID;
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 c.LastName, c.FirstName, v.Name
FROM Person.Contact AS c
INNER JOIN HumanResources.Employee AS e
ON e.ContactID = c.ContactID
INNER JOIN Purchasing.PurchaseOrderHeader AS poh
ON e.EmployeeID = poh.EmployeeID
INNER JOIN Purchasing.Vendor AS v
ON poh.VendorID = v.VendorID;
GO
SET SHOWPLAN_TEXT OFF;
GO
SET FORCEPLAN OFF;
GO
Vedere anche