最可靠方法是按Ctrl+L查看估计执行计划,因其不执行查询、无I/O开销;而Ctrl+M生成实际执行计划需真实运行语句,适合分析真实资源消耗。

在 SSMS 中按 Ctrl+L 查看图形化执行计划
SQL Server Management Studio(SSMS)里最直接的方式就是写完 SELECT 语句后,不执行它,直接按 Ctrl+L。这时 SSMS 会生成并显示图形化执行计划,不真正跑查询,也不锁表、不产生 I/O 开销。
常见错误是先按 F5 或工具栏“执行”按钮——这会真实运行语句,返回结果的同时才顺带显示执行计划,可能误触高成本查询或影响线上环境。
- 确保查询窗口焦点在 SQL 文本内,否则
Ctrl+L无响应 - 若提示“未连接到服务器”,需先右键“对象资源管理器”中目标实例 → “连接”
- 图形计划中鼠标悬停在任一操作符上,会显示“预计子树成本”,数值越小通常表示该步骤开销越低
用 SET SHOWPLAN_XML ON 替代 SHOWPLAN_ALL 获取结构化计划
SET SHOWPLAN_ALL ON 虽然能返回文本计划,但输出列多达 130 多个,字段名晦涩(如 PhysicalOp、EstimateIO),且已从 SQL Server 2022 起标记为“弃用”。更推荐用 SET SHOWPLAN_XML ON,它返回标准 XML,可直接粘贴进浏览器或用 SQL Server 自带的“显示执行计划”窗口渲染成图形。
实操时注意顺序不能错:
- 必须先执行
SET SHOWPLAN_XML ON,再执行你的SELECT语句 - 执行完后立刻执行
SET SHOWPLAN_XML OFF,否则后续所有语句都不实际执行 - XML 输出里
<RelOp NodeId="0" PhysicalOp="Clustered Index Seek">这类节点,比文本模式里的PhysicalOp字段更容易对应到图形界面中的具体操作符
MySQL 里用 EXPLAIN 看等价执行计划
MySQL 没有图形化查询分析器,但 EXPLAIN 是等效入口。对任意 SELECT 加前缀即可,比如 EXPLAIN SELECT * FROM users WHERE id = 123。关键不是记住所有字段,而是盯住三列:type、key、rows。
容易踩的坑:
-
type出现ALL表示全表扫描,优先检查WHERE条件字段是否建了索引 -
key为空但possible_keys有值,说明优化器认为走索引不如全表扫描快——可能是统计信息过期,可运行ANALYZE TABLE users -
rows值远大于实际匹配行数,往往意味着索引选择性差或数据分布倾斜,EXPLAIN FORMAT=JSON会额外给出filtered字段帮你判断
执行计划不是银弹:成本估算和真实性能常不一致
图形计划里的“预计子树成本”或 EXPLAIN 的 rows 都基于统计信息采样估算,不是实测值。一张表刚插入 10 万行但没更新统计信息,计划可能仍按 100 行估算;分区表跨多个分区查询时,rows 可能只显示单个分区的预估。
真正卡顿的查询,光看计划不够——得结合 SET STATISTICS IO ON(SQL Server)或 SHOW PROFILE(MySQL 5.6+)看真实逻辑读、物理读、执行时间。计划告诉你“打算怎么走”,IO 和时间才告诉你“实际走了多远”。

















