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