SET FORCEPLAN (Transact-SQL)
Lorsque FORCEPLAN a pour valeur ON, l'optimiseur de requête SQL Server traite une jointure dans le même ordre que celui où les tables apparaissent dans la clause FROM d'une requête. Qui plus est, la définition de FORCEPLAN à ON force l'utilisation d'une jointure de boucles imbriquées sauf si d'autres types de jointures sont nécessaires pour construire un plan pour la requête ou si elles sont demandées avec des indicateurs de requête ou de jointure.
Syntaxe
SET FORCEPLAN { ON | OFF }
Notes
SET FORCEPLAN a priorité sur la logique utilisée par l'optimiseur pour traiter une instruction Transact-SQL SELECT. Les données renvoyées par l'instruction SELECT sont identiques, que cette option soit ou non utilisée. La seule différence est la façon dont SQL Server traite les tables durant l'exécution de la requête.
Les indicateurs de l'optimiseur de requête peuvent également être utilisés dans les requêtes pour modifier la façon dont SQL Server traite l'instruction SELECT.
L'option SET FORCEPLAN est appliquée lors de l'exécution et non pas au moment de l'analyse.
Autorisations
Les autorisations SET FORCEPLAN sont octroyées par défaut à tous les utilisateurs.
Exemple
L'exemple suivant effectue une jointure de quatre tables. L'option SHOWPLAN_TEXT est activée afin que SQL Server renvoie des informations indiquant comment la requête est traitée différemment après l'activation de SET FORCE_PLAN.
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