0Pricing
SQL Academy · 课时

阅读 EXPLAIN 与 EXPLAIN ANALYZE

阅读计划树,理解成本与实际耗时的差异,并找出开销最大的节点

阅读 EXPLAIN 与 EXPLAIN ANALYZE 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。

为什么使用 EXPLAIN?

EXPLAIN 会显示规划器执行查询的策略,但不会运行查询。EXPLAIN ANALYZE 会运行查询,并显示实际耗时。

基本 EXPLAIN

显示估算的执行计划:

EXPLAIN SELECT * FROM orders WHERE user_id = 42;
--                            QUERY PLAN
-- ---------------------------------------------------------------
-- Index Scan using orders_user_id_idx on orders
--   (cost=0.43..8.45 rows=5 width=120)
--   Index Cond: (user_id = 42)

EXPLAIN ANALYZE

运行查询,并添加实际耗时和行数:

EXPLAIN ANALYZE SELECT * FROM orders WHERE user_id = 42;
-- Index Scan using orders_user_id_idx on orders
--   (cost=0.43..8.45 rows=5 width=120)
--   (actual time=0.041..0.043 rows=4 loops=1)
-- Planning Time: 0.082 ms
-- Execution Time: 0.057 ms

读取执行计划树

执行计划是树状结构。缩进表示子节点。子节点会先于父节点运行。

Aggregate
  -> Hash Join
     Hash Cond: (o.user_id = u.id)
     -> Seq Scan on orders
     -> Hash
        -> Seq Scan on users

成本与耗时

cost 列包含 TWO 个数字:startup_cost..total_cost。这些是规划器使用的任意单位,并不是秒数。请使用 actual time 获取真实数值。

rows = 估算值;actual rows = 实际值

rows 是规划器的估计值。actual rows 是实际发生的结果。如果两者相差很大,说明统计信息不准确。

循环会放大时间

对于嵌套循环,actual time=X loops=N 表示每次迭代耗时 X;每个节点的总耗时为 X×N。

Nested Loop  (actual time=0.05..2.03 rows=500)
  -> Seq Scan on orders  (actual ... loops=1)
  -> Index Scan using users_pkey  (actual time=0.01..0.01 loops=500)

BUFFERS 告诉您输入/输出情况

EXPLAIN (ANALYZE, BUFFERS) 会报告缓冲区命中和读取情况,也就是这些耗时背后的输入/输出:

EXPLAIN (ANALYZE, BUFFERS) SELECT ...;
-- Buffers: shared hit=12 read=4

FORMAT 选项

如果要进行程序化处理,请使用 JavaScript 对象表示法或 YAML:

EXPLAIN (ANALYZE, FORMAT JSON) SELECT ...;

不要对具有破坏性的语句执行 EXPLAIN ANALYZE!

对 UPDATE/DELETE/INSERT 执行 EXPLAIN ANALYZE 会实际执行这些语句。如果您想检查语句但不提交,请将其放在事务中,并使用 ROLLBACK:

BEGIN;
EXPLAIN ANALYZE DELETE FROM orders WHERE ...;
ROLLBACK;

常见的计划节点

  • 顺序扫描 — 读取整个表
  • 索引扫描 — 使用索引
  • 位图堆扫描 — 组合多个索引
  • 哈希连接 / 合并连接 / 嵌套循环 — 连接策略
  • 排序、聚合、限制、物化

阅读计划的工作流程

  1. 对运行缓慢的查询执行 EXPLAIN ANALYZE
  2. 找到 actual time 最高的节点
  3. 比较估算的 rows 与 actual rows
  4. 检查是否正在使用索引
  5. 反复调整:添加索引 / 重写 / ANALYZE

回顾

EXPLAIN ANALYZE 是您主要的性能工具。

  • 成本是相对值,时间是真实值
  • 估算行数与实际行数的差异可以揭示统计信息问题
  • BUFFERS 显示输入/输出情况
  • 将具有破坏性的查询放在 BEGIN; ... ROLLBACK 中

快速检查

EXPLAIN 和 EXPLAIN ANALYZE 有什么区别?

常见问题解答

「阅读 EXPLAIN 与 EXPLAIN ANALYZE」课时是免费的吗?

是的 — 「阅读 EXPLAIN 与 EXPLAIN ANALYZE」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。

「阅读 EXPLAIN 与 EXPLAIN ANALYZE」这节课中我会学到什么?

阅读计划树,理解成本与实际耗时的差异,并找出开销最大的节点 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 SQL Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「阅读 EXPLAIN 与 EXPLAIN ANALYZE」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 SQL Academy 课中编写并运行代码吗?

能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 阅读 EXPLAIN 与 EXPLAIN ANALYZE
  2. 顺序扫描与索引扫描
  3. 哈希连接、合并连接与嵌套循环
  4. 识别并修复慢查询
← 返回 SQL Academy