SET SHOWPLAN_TEXT (Transact-SQL)

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

導致 Microsoft SQL Server 不執行 Transact-SQL 陳述式。 相反地,SQL Server 會傳回如何執行這些陳述式的詳細資訊。

Transact-SQL 語法慣例

Syntax

  
SET SHOWPLAN_TEXT { ON | OFF }  

注意

若要檢視 SQL Server 2014 (12.x) 和舊版的 Transact-SQL 語法,請參閱 舊版檔

備註

SET SHOWPLAN_TEXT 的設定是在執行階段進行設定,而不是在剖析階段進行設定。

當 SET SHOWPLAN_TEXT 為 ON 時,SQL Server 會傳回每個 Transact-SQL 陳述式的執行資訊,而不需執行它。 將此選項設為 ON 之後,即會傳回所有後續 SQL Server 陳述式的執行計畫相關資訊,直到將此選項設為 OFF 為止。 例如,如果在 SHOWPLAN_TEXT 為 ON 時執行 CREATE TABLE 陳述式,SQL Server 就會從包含該相同資料表的後續 SELECT 陳述式中傳回錯誤訊息,通知使用者指定的資料表並不存在。 因此,後來參考這份資料表都會失敗。 當 SET SHOWPLAN_TEXT 為 OFF 時,SQL Server 會執行陳述式,而不產生內含執行計畫資訊的報表。

SET SHOWPLAN_TEXT 是要用來傳回 Microsoft Win32 命令提示字元應用程式 (例如 sqlcmd 公用程式) 的可讀取輸出。 SET SHOWPLAN_ALL 會傳回詳細的輸出,用來搭配專為了處理其輸出而設計的程式。

在預存程序中,無法指定 SET SHOWPLAN_TEXT 和 SET SHOWPLAN_ALL。 它們必須是批次中僅有的陳述式。

SET SHOWPLAN_TEXT 會以一組資料列的形式傳回資訊,這些資料列會形成階層式樹狀結構,呈現 SQL Server 查詢處理器在執行每個陳述式時所採取的步驟。 輸出中所反映的每個陳述式都包含單一資料列,其中含有陳述式的文字,後面再接著幾個資料列,其中含有執行步驟的詳細資料。 下表顯示輸出所包含的資料行。

資料行名稱 描述
StmtText 對於類型不為 PLAN_ROW 的資料列,此資料行會包含 Transact-SQL 陳述式的文字。 對於類型是 PLAN_ROW 的資料列,這個資料行包含作業的說明。 這個資料行包含實體運算子,也可能選擇性地包含邏輯運算子。 這個資料行後面可能接著取決於實體運算子的說明。 如需實體運算子的詳細資訊,請參閱 SET SHOWPLAN_ALL (Transact-SQL)引數資料行的詳細資訊。

如需在顯示計畫輸出中所能見到之實體和邏輯運算子的詳細資訊,請參閱執行程序表邏輯及實體運算子參考

權限

若要使用 SET SHOWPLAN_TEXT,您必須有執行 SET SHOWPLAN_TEXT 所針對的陳述式之適當權限,且您必須有包含所參考物件的所有資料庫之 SHOWPLAN 權限。

對於 SELECT、INSERT、UPDATE、DELETE、EXEC stored_procedure 和 EXEC user_defined_function 陳述式,若要產生執行程序表,使用者必須:

  • 具備用來執行 Transact-SQL 陳述式的適當權限。

  • 有包含 Transact-SQL 陳述式所參考的物件 (如資料表、檢視等等) 之所有資料庫的 SHOWPLAN 權限。

至於所有其他陳述式,例如 DDL、USE database_name、SET、DECLARE、動態 SQL 等等,只需具備執行 Transact-SQL 陳述式的適當權限。

範例

此範例示範 SQL Server 在處理陳述式時使用索引的方式。

這是使用索引的查詢:

USE AdventureWorks2022;  
GO  
SET SHOWPLAN_TEXT ON;  
GO  
SELECT *  
FROM Production.Product   
WHERE ProductID = 905;  
GO  
SET SHOWPLAN_TEXT OFF;  
GO  

以下為結果集:

StmtText                                             
---------------------------------------------------  
SELECT *  
FROM Production.Product   
WHERE ProductID = 905;   
  
StmtText                                                                                                                                                                                        
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------  
|--Clustered Index Seek(OBJECT:([AdventureWorks2022].[Production].[Product].[PK_Product_ProductID]), SEEK:([AdventureWorks2022].[Production].[Product].[ProductID]=CONVERT_IMPLICIT(int,[@1],0)) ORDERED FORWARD)   

這是不使用索引的查詢:

USE AdventureWorks2022;  
GO  
SET SHOWPLAN_TEXT ON;  
GO  
SELECT *  
FROM Production.ProductCostHistory  
WHERE StandardCost < 500.00;  
GO  
SET SHOWPLAN_TEXT OFF;  
GO  

以下為結果集:

StmtText                                                                  
------------------------------------------------------------------------  
SELECT *  
FROM Production.ProductCostHistory  
WHERE StandardCost < 500.00;   
  
StmtText                                                                                                                                                                                                  
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------  
|--Clustered Index Scan(OBJECT:([AdventureWorks2022].[Production].[ProductCostHistory].[PK_ProductCostHistory_ProductCostID]), WHERE:([AdventureWorks2022].[Production].[ProductCostHistory].[StandardCost]<[@1]))  

另請參閱

運算子 (Transact-SQL)
SET 陳述式 (Transact-SQL)
SET SHOWPLAN_ALL (Transact-SQL)