适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
Microsoft Fabric 中的 SQL 数据库
当 FORCEPLAN 设置为 ON时,SQL Server查询优化器会按照查询FROM子句中表格出现的顺序处理连接。 此外,设置 FORCEPLAN 为 ON 会强制使用嵌套环路连接,除非需要其他类型的连接来构建查询计划,或请求连接提示或查询提示。
语法
SET FORCEPLAN { ON | OFF }
备注
SET FORCEPLAN 本质上覆盖了查询优化器处理 Transact-SQL SELECT 语句的逻辑。 SELECT 语句返回的数据同样与该设置无关。 唯一的差别是 SQL Server 为满足查询对表进行处理的方式。
在查询中也可以使用查询优化器提示影响 SQL Server 处理 SELECT 语句的方式。
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)