SET FORCEPLAN (Transact-SQL)

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBase de données SQL dans Microsoft Fabric

Lorsque FORCEPLAN la requête est réglée sur ON, l’optimiseur de requêtes SQL Server traite une jointure dans le même ordre que les tables apparaissant dans la clause FROM d’une requête. De plus, le réglage FORCEPLAN sur ON force l’utilisation d’une jointure en boucle imbriquée, sauf si d’autres types de jointures ne sont nécessaires pour construire un plan pour la requête, ou qu’elles soient demandées avec des indices de jointure ou de requête.

Conventions de la syntaxe Transact-SQL

Syntaxe

  
SET FORCEPLAN { ON | OFF }  

Notes

SET FORCEPLAN en gros, il outrepasse la logique utilisée par l’optimiseur de requêtes 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.

SET FORCEPLAN est appliqué à l’exécution ou à l’exécution et non à l’analyse.

Autorisations

SET FORCEPLAN Les permissions par défaut sont pour tous les utilisateurs.

Exemples

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 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  

Voir aussi

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