SET FORCEPLAN (Transact-SQL)

Se aplica a:SQL ServerAzure SQL DatabaseInstancia administrada de Azure SQLBase de datos SQL en Microsoft Fabric

Cuando FORCEPLAN está configurado en ON, el optimizador de consultas de SQL Server procesa una unión en el mismo orden en que aparecen las tablas en la cláusula FROM de una consulta. Además, establecer FORCEPLAN en ON obliga a usar una unión de bucle anidada a menos que se requieran otros tipos de uniones para construir un plan para la consulta, o se soliciten con pistas de unión o de consulta.

Convenciones de sintaxis de Transact-SQL

Sintaxis

  
SET FORCEPLAN { ON | OFF }  

Comentarios

SET FORCEPLAN esencialmente anula la lógica utilizada por el optimizador de consultas para procesar una sentencia Transact-SQL SELECT. Los datos que devuelve la instrucción SELECT son los mismos, independientemente del valor de esta opción. La única diferencia es el modo en que SQL Server procesa las tablas para satisfacer la consulta.

Las sugerencias del optimizador de consultas se pueden usar también en las consultas para influir en el modo en que SQL Server procesa la instrucción SELECT.

SET FORCEPLAN se aplica en tiempo de ejecución o ejecución y no en tiempo de análisis analizable.

Permisos

SET FORCEPLAN Los permisos por defecto son para todos los usuarios.

Ejemplos

En el ejemplo siguiente se realiza una combinación de cuatro tablas. La opción SHOWPLAN_TEXT está habilitada, por lo que SQL Server devuelve información sobre cómo va a procesar la consulta de forma distinta cuando se habilite la opción 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  

Consulte también

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