SET SHOWPLAN_TEXT (Transact-SQL)
使 Microsoft SQL Server 不執行 Transact-SQL 陳述式。相反地,SQL Server 會傳回如何執行這些陳述式的詳細資料。
語法
SET SHOWPLAN_TEXT { ON | OFF }
備註
SET SHOWPLAN_TEXT 的設定是在執行階段進行設定,而不是在剖析階段進行設定。
當 SET SHOWPLAN_TEXT 是 ON 時,SQL Server 無需執行每一項 Transact-SQL 陳述式,即可傳回其執行資訊。在這個選項設為 ON 之後,會傳回所有後續 SQL Server 陳述式的執行計畫相關資訊,直到這個選項設為 OFF 為止。例如,如果執行 CREATE TABLE 陳述式時,SHOWPLAN_TEXT 是 ON,SQL Server 會從包含這份相同資料表的後續 SELECT 陳述式傳回錯誤訊息,通知使用者指定的資料表並不存在。因此,對這份資料表的後續參考都會失敗。當 SET SHOWPLAN_TEXT 是 OFF 時,SQL Server 會直接執行陳述式,而不會產生內含執行計畫資訊的報表。
SET SHOWPLAN_TEXT 用來傳回 Microsoft Win32 命令提示字元應用程式 (如 osql 公用程式) 之可讀取的輸出。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 陳述式的適當權限。
如需詳細資訊,請參閱<執行程序表安全性>和<SHOWPLAN 權限與 Transact-SQL 批次>。
範例
這個範例會顯示 SQL Server 在處理陳述式時,如何使用索引。
這是使用索引的查詢:
USE AdventureWorks;
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:([AdventureWorks].[Production].[Product].[PK_Product_ProductID]), SEEK:([AdventureWorks].[Production].[Product].[ProductID]=CONVERT_IMPLICIT(int,[@1],0)) ORDERED FORWARD)
這是不使用索引的查詢:
USE AdventureWorks;
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:([AdventureWorks].[Production].[ProductCostHistory].[PK_ProductCostHistory_ProductCostID]), WHERE:([AdventureWorks].[Production].[ProductCostHistory].[StandardCost]<[@1]))