SQL Server 中 查询执行计划
深入理解 SQL Server 中的 SET SHOWPLAN_TEXT ON
与 SET SHOWPLAN_ALL ON
SQL 性能调优离不开“查询执行计划”。本文将深入讲解 SQL Server 中两个非常有用的调试工具:
SET SHOWPLAN_TEXT ON
和SET SHOWPLAN_ALL ON
,并通过示例展示它们的使用场景与区别。
一、什么是查询执行计划?
在 SQL Server 中,当我们执行一条查询语句时,SQL 引擎并不会直接去查数据,而是会先生成一个执行计划(Execution Plan),决定用什么方式访问表、是否使用索引、选择哪种连接方式(Nested Loops、Hash Join 等)。
良好的执行计划能大大提升查询效率,而不合理的计划可能造成慢查询甚至系统压力异常。
二、为什么要用 SET SHOWPLAN_*
?
有时我们希望查看执行计划,而不是实际执行查询,特别是下面这些场景:
-
查询太重,不方便直接执行
-
想分析 SQL 写法是否影响优化器选择路径
-
用来教学或调试执行逻辑
这时候,SQL Server 提供了几个“只显示不执行”的工具,其中常用的有:
-
SET SHOWPLAN_TEXT ON
-
SET SHOWPLAN_ALL ON
-
SET SHOWPLAN_XML ON
(更高级,用于图形化分析)
三、SET SHOWPLAN_TEXT ON
简介
✅ 功能:
以文本树状结构的形式显示执行计划。
🧪 示例:
📋 输出样例:
表示该查询将使用聚集索引扫描,通常意味着没有使用到索引查找(Seek),性能可能不理想。
⚠ 注意事项:
-
必须单独执行
SET
语句,不能和查询语句写在一起。 -
查询不会真正执行,只会返回优化器计划。
四、SET SHOWPLAN_ALL ON
简介
✅ 功能:
输出更详细的执行计划信息,返回的是结构化的表格,适合做进一步分析。
🧪 示例:
📋 输出示意(表格结构):
StmtText | NodeId | PhysicalOp | LogicalOp | EstimatedRows | EstimatedCPU | EstimatedIO |
---|---|---|---|---|---|---|
SELECT... | 1 | Clustered Index Seek | Seek | 1 | 0.0001572 | 0.003125 |
可见,该查询使用了索引 Seek,预估只需读取 1 行,性能较好。
五、二者的区别与选择
对比项 | SHOWPLAN_TEXT | SHOWPLAN_ALL |
---|---|---|
输出格式 | 文本树形结构 | 表格结构 |
信息量 | 基础执行路径 | 包含资源估算、连接方式等 |
易读性 | 直观简单 | 更详细但不太直观 |
是否执行查询 | 否 | 否 |
适合场景 | 快速查看路径、教学演示 | 性能分析、调优、对比执行代价 |
六、实际应用建议
-
在 SQL 优化初期,用
SHOWPLAN_TEXT
看是否用了扫描(Scan)而不是查找(Seek)。 -
在查询调优阶段,用
SHOWPLAN_ALL
分析估算行数、连接方式、资源使用等信息。 -
执行完分析记得
SET SHOWPLAN_* OFF;
,否则你后续写的查询不会真正执行!
七、常见错误提示及解决
❌ 错误:SET SHOWPLAN 语句必须是批处理中仅有的语句
说明你将 SET SHOWPLAN_TEXT ON;
和其他 SQL 写在同一个 batch 中,应如下分开:
八、总结
SQL Server 的 SET SHOWPLAN_TEXT ON
与 SET SHOWPLAN_ALL ON
是非常强大的调试工具。它们提供了“只看不执行”的方式来分析执行计划,帮助开发者从根本上理解 SQL 语句在数据库中是如何运行的。
善用它们,是成为 SQL 性能调优高手的重要一步!