SQL Server 中 查询执行计划

深入理解 SQL Server 中的 SET SHOWPLAN_TEXT ONSET SHOWPLAN_ALL ON

SQL 性能调优离不开“查询执行计划”。本文将深入讲解 SQL Server 中两个非常有用的调试工具:SET SHOWPLAN_TEXT ONSET 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 简介

✅ 功能:

文本树状结构的形式显示执行计划。

🧪 示例:

sql
SET SHOWPLAN_TEXT ON;
GO

SELECT * FROM Orders WHERE OrderDate > '2023-01-01';
GO

SET SHOWPLAN_TEXT OFF;
GO

 

📋 输出样例:

  |--Clustered Index Scan(OBJECT:([dbo].[Orders].[PK_Orders]))

表示该查询将使用聚集索引扫描,通常意味着没有使用到索引查找(Seek),性能可能不理想。

⚠ 注意事项:

  • 必须单独执行 SET 语句,不能和查询语句写在一起。

  • 查询不会真正执行,只会返回优化器计划。


四、SET SHOWPLAN_ALL ON 简介

✅ 功能:

输出更详细的执行计划信息,返回的是结构化的表格,适合做进一步分析。

🧪 示例:

sql
SET SHOWPLAN_ALL ON;
GO

SELECT * FROM Orders WHERE CustomerID = 'ALFKI';
GO

SET SHOWPLAN_ALL OFF;
GO

 

📋 输出示意(表格结构):

StmtTextNodeIdPhysicalOpLogicalOpEstimatedRowsEstimatedCPUEstimatedIO
SELECT... 1 Clustered Index Seek Seek 1 0.0001572 0.003125

可见,该查询使用了索引 Seek,预估只需读取 1 行,性能较好。


五、二者的区别与选择

对比项SHOWPLAN_TEXTSHOWPLAN_ALL
输出格式 文本树形结构 表格结构
信息量 基础执行路径 包含资源估算、连接方式等
易读性 直观简单 更详细但不太直观
是否执行查询
适合场景 快速查看路径、教学演示 性能分析、调优、对比执行代价

六、实际应用建议

  • 在 SQL 优化初期,用 SHOWPLAN_TEXT 看是否用了扫描(Scan)而不是查找(Seek)。

  • 在查询调优阶段,用 SHOWPLAN_ALL 分析估算行数连接方式资源使用等信息。

  • 执行完分析记得 SET SHOWPLAN_* OFF;,否则你后续写的查询不会真正执行!


七、常见错误提示及解决

❌ 错误:SET SHOWPLAN 语句必须是批处理中仅有的语句

说明你将 SET SHOWPLAN_TEXT ON; 和其他 SQL 写在同一个 batch 中,应如下分开:

sql
SET SHOWPLAN_TEXT ON;
GO

-- 单独写查询
SELECT * FROM ...;
GO

 


八、总结

SQL Server 的 SET SHOWPLAN_TEXT ONSET SHOWPLAN_ALL ON 是非常强大的调试工具。它们提供了“只看不执行”的方式来分析执行计划,帮助开发者从根本上理解 SQL 语句在数据库中是如何运行的。

善用它们,是成为 SQL 性能调优高手的重要一步!

posted @ 2025-06-27 10:41  曲琦  阅读(200)  评论(0)    收藏  举报