SET FORCEPLAN (Transact-SQL)
Если параметр FORCEPLAN установлен в значение ON, оптимизатор запросов MicrosoftSQL Server обрабатывает соединение в порядке появления таблиц в предложении FROM запроса. Кроме того, при установке параметра FORCEPLAN в значение ON, принудительно используется вложенный цикл соединения, если для построения плана запроса не требуются другие типы соединений, или же они запрашиваются с подсказками в соединении или о запросе.
Синтаксис
SET FORCEPLAN { ON | OFF }
Замечания
Инструкция SET FORCEPLAN, в сущности, переопределяет логику, используемую в оптимизаторе запросов для обработки инструкции языка Transact-SQL SELECT. Данные, возвращаемые инструкцией SELECT, не зависят от этого параметра. Единственное различие — способ обработки таблиц в SQL Server, применяемый для выполнения запроса.
Подсказки оптимизатора запросов могут быть использованы в запросах для изменения способа обработки инструкции SELECT в SQL Server.
Инструкция SET FORCEPLAN применяется на этапе выполнения или запуска, но не на этапе синтаксического анализа.
Разрешения
Разрешения SET FORCEPLAN по умолчанию имеют все пользователи.
Примеры
В следующем примере выполняется соединение четырех таблиц. Параметр SHOWPLAN_TEXT включен, поэтому SQL Server иначе возвращает данные о способе обработки запроса, нежели после включения параметра 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