Partilhar via


DEFINIR O PLANO DE FORÇA (Transact-SQL)

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBase de dados SQL no Microsoft Fabric

Quando o FORCEPLAN está definido como ON, o otimizador de consultas do SQL Server processa uma junção na mesma ordem em que as tabelas aparecem na cláusula FROM de uma consulta. Além disso, definir FORCEPLAN como ON força o uso de uma junção de loop aninhada, a menos que outros tipos de junções sejam necessários para construir um plano para a consulta, ou sejam solicitadas com dicas de junção ou de consulta.

Transact-SQL convenções de sintaxe

Sintaxe

  
SET FORCEPLAN { ON | OFF }  

Observações

O SET FORCEPLAN sobrepõe-se essencialmente à lógica usada pelo otimizador de consultas para processar uma instrução Transact-SQL SELECT. Os dados devolvidos pela instrução SELECT são os mesmos independentemente desta definição. A única diferença é a forma como o SQL Server processa as tabelas para satisfazer a consulta.

As dicas do otimizador de consultas também podem ser usadas em consultas para afetar a forma como o SQL Server processa a instrução SELECT.

SET FORCEPLAN é aplicado em tempo de execução ou execução e não em tempo de análise.

Permissions

As permissões SET FORCEPLAN são predefinidas para todos os utilizadores.

Examples

O exemplo seguinte realiza uma junção de quatro tabelas. A SHOWPLAN_TEXT definição está ativada, por isso o SQL Server devolve informação sobre como está a processar a consulta de forma diferente depois de a SET FORCE_PLAN definição estar ativada.

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  

Ver também

SELECIONAR (Transact-SQL)
Instruções SET (Transact-SQL)
SET SHOWPLAN_ALL (Transact-SQL)
SET SHOWPLAN_TEXT (Transact-SQL)