SET SHOWPLAN_TEXT (Transact-SQL)

使 Microsoft SQL Server 不执行 Transact-SQL 语句。而是由 SQL Server 返回有关如何执行语句的详细信息。

主题链接图标Transact-SQL 语法约定

语法

SET SHOWPLAN_TEXT { ON | OFF }

注释

SET SHOWPLAN_TEXT 的设置是在执行或运行时设置的,而不是在分析时设置的。

当 SET SHOWPLAN_TEXT 为 ON 时,SQL Server 将返回每个 Transact-SQL 语句的执行信息,但不执行语句。将该选项设置为 ON 以后,将返回有关所有后续 SQL Server 语句的执行计划信息,直到将该选项设置为 OFF 为止。例如,如果在 SET SHOWPLAN_TEXT 为 ON 时执行 CREATE TABLE 语句,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) 中的 Argument 列。

有关可以在显示计划输出中看到的物理和逻辑运算符的详细信息,请参阅逻辑运算符和物理运算符引用

权限

为了使用 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 AdventureWorks2008R2;
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:([AdventureWorks2008R2].[Production].[Product].[PK_Product_ProductID]), SEEK:([AdventureWorks2008R2].[Production].[Product].[ProductID]=CONVERT_IMPLICIT(int,[@1],0)) ORDERED FORWARD) 

下面是不使用索引的查询:

USE AdventureWorks2008R2;
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:([AdventureWorks2008R2].[Production].[ProductCostHistory].[PK_ProductCostHistory_ProductCostID]), WHERE:([AdventureWorks2008R2].[Production].[ProductCostHistory].[StandardCost]<[@1]))