SET FORCEPLAN (Transact-SQL)
Quando FORCEPLAN está definido como ON, o otimizador de consulta do MicrosoftSQL Server processa uma junção na mesma ordem conforme as tabelas são exibidas na cláusula FROM de uma consulta. Além disso, configurar FORCEPLAN como ON força o uso de uma junção de loop aninhado, a não ser que outros tipos de junção sejam necessários ao construir um plano para a consulta ou eles sejam solicitados com dicas de junção ou dicas de consulta.
Sintaxe
SET FORCEPLAN { ON | OFF }
Comentários
SET FORCEPLAN basicamente substitui a lógica usada pelo otimizador de consulta para processar uma instrução SELECT Transact-SQL. Os dados retornados pela instrução SELECT são os mesmos independentemente dessa configuração. A única diferença é o modo pelo qual o SQL Server processa as tabelas para satisfazer a consulta.
Também podem ser usadas dicas do otimizador de consulta em consultas para afetar a forma como o SQL Server processa a instrução SELECT.
SET FORCEPLAN é aplicado na execução ou em tempo de execução e não no momento da análise.
Permissões
Permissões de SET FORCEPLAN assumem como padrão todos os usuários.
Exemplos
O exemplo a seguir executa uma junção de quatro tabelas. A configuração SHOWPLAN_TEXT está habilitada, portanto o SQL Server retorna as informações sobre como o processamento da consulta é diferente depois de habilitar a configuração 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
Consulte também