SET SHOWPLAN_TEXT (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Microsoft Fabric 中的 SQL 数据库

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

Transact-SQL 语法约定

语法

  
SET SHOWPLAN_TEXT { ON | OFF }  

备注

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

当 SET SHOWPLAN_TEXT 开启时,SQL Server 返回每个 Transact-SQL 语句的执行信息,但不执行该语句。 将该选项设置为 ON 以后,将返回有关所有后续 SQL Server 语句的执行计划信息,直到将该选项设置为 OFF 为止。 例如,如果CREATE TABLE某个语句在 开启状态下SETSET SHOWPLAN_TEXT执行,SQL Server 会返回来自后续 SELECT 语句的错误消息,告知用户该指定表不存在。 因此,对此表的后续引用将失败。 当 关闭时SET SHOWPLAN_TEXT,SQL Server 执行语句时不会生成包含执行计划信息的报告。

SET SHOWPLAN_TEXT旨在返回可读输出的 Microsoft Win32 命令提示符应用程序,如 sqlcmd 工具。 SET SHOWPLAN_ALL 返回更详细的输出,这些输出是为处理其输出而设计的程序所设计的。

SET SET SHOWPLAN_TEXT 并且 SETSET SHOWPLAN_ALL 无法在存储过程中指定。 它们必须是批处理中的唯一语句。

SET SHOWPLAN_TEXT返回信息为一组行,形成一个层级树,代表 SQL Server 查询处理器执行每个语句时所采取的步骤。 在输出中,每个语句都有一行说明语句的文本,后面紧接着几行介绍执行步骤的详细信息。 下表显示输出中包含的列。

列名称 说明
StmtText 对于不是 PLAN_ROW 类型的行,此列包含 Transact-SQL 语句的文本。 对于 PLAN_ROW 类型的行,此列包含对操作的说明。 此列包含物理运算符,也可以选择包含逻辑运算符。 该列的后面还可以跟有由物理运算符决定的说明。 关于物理算符的更多信息,请参见(Transact-SQL)中的SET SHOWPLAN_ALL论元列。

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

权限

要使用 SETSET SHOWPLAN_TEXT,您必须拥有足够的权限来执行执行所 SETSET SHOWPLAN_TEXT 执行的语句,并且必须对包含引用对象的所有数据库拥有 SHOWPLAN 权限。

对于 SELECT、INSERT、UPDATEDELETE、EXEC stored_procedure 和 EXEC user_defined_function 语句,要生成 Showplan,用户必须:

  • 具有执行 Transact-SQL 语句的相应权限。

  • 对包含 Transact-SQL 语句所引用的对象(如表、视图等)的所有数据库拥有 SHOWPLAN 权限。

对于其他所有语句,如 DDL、USE database_name、 SETDECLARE、动态 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)