SET FORCEPLAN (Transact-SQL)

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體

當 FORCEPLAN 設定為 ON 時,SQL Server 查詢最佳化工具會依照資料表在查詢的 FROM 子句中出現的順序來處理聯結。 此外,除非需要其他類型的聯結來建構查詢計畫,或者聯結提示或查詢提示要求這些聯結類型,否則將 FORCEPLAN 設定為 ON 便可強制使用巢狀迴圈聯結。

Transact-SQL 語法慣例

Syntax

  
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)