适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
Microsoft Fabric 中的 SQL 数据库
使 Microsoft SQL Server 不执行 Transact-SQL 语句。 相反,SQL Server 返回有关如何执行语句(查询计划)的详细信息,并提供对语句和预期行的资源需求的估计(基数估计)。
语法
SET SHOWPLAN_ALL { ON | OFF }
备注
SET SHOWPLAN_ALL设置是在执行或运行时设置的,而不是在分析时设置的。
如果 SET SHOWPLAN_ALL 为 ON,则 SQL Server 将返回每个语句的执行信息但不执行语句,并且 Transact-SQL 语句不会执行。 该选项设置为 ON 后,将返回有关所有后续 Transact-SQL 语句的信息,直到该选项设置为 OFF 为止。 例如,如果在 开启状态下执行SET SHOWPLAN_ALL语CREATE TABLE句,SQL Server 会返回涉及该表的后续 SELECT 语句的错误消息,告知用户该指定表不存在。 因此,对此表的后续引用将失败。 当关闭时SET SHOWPLAN_ALL,SQL Server 执行语句而不生成报告。
SET SHOWPLAN_ALL 是供为处理其输出而编写的应用程序使用的。 用于SET SHOWPLAN_TEXT返回 Microsoft Win32 命令提示符应用程序(如 osql 工具)的可读输出。
SET SET SHOWPLAN_TEXT 且 SETSET SHOWPLAN_ALL 不能在存储过程中指定;它们必须是批处理中唯一的语句。
SET SHOWPLAN_ALL返回信息为一组行,形成一个层级树,代表 SQL Server 查询处理器执行每个语句时所采取的步骤。 在输出中,每个语句都有一行说明语句的文本,后面紧接着几行介绍执行步骤的详细信息。 下表显示了输出中包含的列。
| 列名称 | 说明 |
|---|---|
| StmtText | 对于不是 PLAN_ROW 类型的行,此列包含 Transact-SQL 语句的文本。 对于 PLAN_ROW 类型的行,此列包含对操作的说明。 此列包含物理运算符,也可以选择包含逻辑运算符。 此列还可以跟一则由物理运算符决定的说明。 有关详细信息,请参阅 Showplan 逻辑运算符和物理运算符参考。 |
| StmtId | 当前批处理中的语句数。 |
| NodeId | 当前查询中的节点的 ID。 |
| Parent | 父步骤的节点 ID。 |
| PhysicalOp | 节点的物理实现算法。 仅限于 PLAN_ROWS 类型的行。 |
| LogicalOp | 此节点表示的关系代数运算符。 仅限于 PLAN_ROWS 类型的行。 |
| Argument | 提供有关当前执行的操作的补充信息。 此列的内容取决于物理运算符。 |
| DefinedValues | 包含一组以逗号分隔的此运算符所引入的值。 这些值可以是出现在当前查询(例如,在 SELECT 列表或 WHERE 子句中)内的计算表达式,也可以是查询处理器为处理该查询引入的内部值。 以后在该查询内的任何其他地方都可以引用这些定义的值。 仅限于 PLAN_ROWS 类型的行。 |
| EstimateRows | 由此运算符生成的预计输出行数。 仅限于 PLAN_ROWS 类型的行。 |
| EstimateIO | 此运算符的预计 I/O 开销*。 仅限于 PLAN_ROWS 类型的行。 |
| EstimateCPU | 此运算符的预计 CPU 开销*。 仅限于 PLAN_ROWS 类型的行。 |
| AvgRowSize | 通过此运算符传递的行的预计平均行大小(以字节为单位)。 |
| TotalSubtreeCost | 此操作和所有子操作的预计(累积)开销*。 |
| OutputList | 包含当前操作正在提取的列的列表,此列表以逗号分隔。 |
| Warnings | 包含一组以逗号分隔的与当前操作相关的警告信息。 警告消息可能包含字符串 "NO STATS:()" 和一组列表。 此警告信息表示查询优化器曾尝试根据此列的统计信息做出决策,但没有找到可用的统计信息。 因此,查询优化器不得不进行推测,这可能已导致选择了低效的查询计划。 关于创建或更新列统计(有助于查询优化器选择更高效的查询计划)的更多信息,请参见 UPDATE STATISTICS。 此列可能选择包含字符串 MISSING JOIN PREDICATE,表示正在进行的联接(与表有关)未使用联接谓词。 意外丢失联接谓词可能导致查询的运行时间比预期长得多,并返回一个巨大的结果集。 如果出现此警告,请验证是否有意不使用联接谓词。 |
| Type | 节点类型。 对于每个查询的父节点,这是 Transact-SQL 语句类型(例如,SELECT、 INSERTEXECUTE等)。 对于表示执行计划的子节点,这是 PLAN_ROW 类型。 |
| Parallel |
0 = 运算符没有以并行方式运行。 1 = 运算符正在以并行方式运行。 |
| EstimateExecutions | 当前查询运行期间,预计将执行此运算符的次数。 |
*开销单位是基于内部时间度量,而不是时钟时间。 它们用于确定某个计划与其他相计划相比的相对开销。
权限
要使用 SETSET SHOWPLAN_ALL,您必须拥有足够的权限来执行执行所 SETSET SHOWPLAN_ALL 执行的语句,并且必须对包含引用对象的所有数据库拥有 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 语句的适当权限。
示例
接下来的两个语句使用这些SET SHOWPLAN_ALL设置来展示 SQL Server 如何分析和优化查询中索引的使用。
第一个查询在 WHERE 子句中使用针对索引列的等于比较运算符 (=)。 从而在 LogicalOp 列内得到 Clustered Index Seek 值,在 Argument 列内生成索引名。
第二个查询在 WHERE 子句中使用 LIKE 运算符。 这将强制 SQL Server 使用聚集索引扫描并查找满足 WHERE 子句条件的数据。 从而在 LogicalOp 列内得到 Clustered Index Scan 值,在 Argument 列内生成索引名;在 LogicalOp 列内得到 Filter 值,在 Argument 列内出现 WHERE 子句条件。
第一个索引查询的 EstimateRows 和 TotalSubtreeCost 列中的值较小,这表示与非索引查询相比,该查询的处理速度快得多且使用的资源更少。
USE AdventureWorks2022;
GO
SET SHOWPLAN_ALL ON;
GO
-- First query.
SELECT BusinessEntityID
FROM HumanResources.Employee
WHERE NationalIDNumber = '509647174';
GO
-- Second query.
SELECT BusinessEntityID, EmergencyContactID
FROM HumanResources.Employee
WHERE EmergencyContactID LIKE '1%';
GO
SET SHOWPLAN_ALL OFF;
GO
另请参阅
SET 语句(Transact-SQL)
SET SHOWPLAN_TEXT (Transact-SQL)
SET SHOWPLAN_XML (Transact-SQL)