SET FORCEPLAN (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例

当 FORCEPLAN 设置为 ON 时,SQL Server 查询优化器处理联接的顺序与表在查询的 FROM 子句中出现的顺序相同。 此外,在将 FORCEPLAN 设置为 ON 的情况下,如果不需要其他类型的联接来构造查询计划,或者使用联接提示或查询提示请求了其他联接类型,则会强制使用嵌套循环联接。

Transact-SQL 语法约定

语法

  
SET FORCEPLAN { ON | OFF }  

注意

若要查看 SQL Server 2014 (12.x) 及更早版本的 Transact-SQL 语法,请参阅早期版本文档

备注

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)