跳到主要内容

PostgreSQL EXPLAIN 执行计划教程

EXPLAIN 显示 PostgreSQL 为一条 SQL 选择的执行计划,EXPLAIN ANALYZE 会真正执行并给出实际耗时与行数,是定位慢查询的起点。

本篇内容​

  • EXPLAIN 与 EXPLAIN ANALYZE
  • 执行计划的基本读法(节点树自底向上)
  • 常见节点类型
  • 估算行数 vs 实际行数的偏差

基本用法​

-- 只看计划(不执行)
EXPLAIN SELECT * FROM users WHERE status = 1;

-- 真正执行,返回实际耗时与行数
EXPLAIN ANALYZE SELECT * FROM users WHERE status = 1;

-- 更详细的输出(BUFFERS 看 IO,FORMAT JSON 便于工具解析)
EXPLAIN (ANALYZE, BUFFERS, VERBOSE)
SELECT u.name, COUNT(*) FROM users u
JOIN orders o ON o.user_id = u.id
GROUP BY u.name;

读懂计划​

计划是一棵节点树,自底向上执行,每层显示预估成本、行数和宽度:

HashAggregate (cost=... rows=...)
-> Hash Join
Hash Cond: (o.user_id = u.id)
-> Seq Scan on orders o
-> Hash
-> Seq Scan on users u
Filter: (status = 1)

常见节点:Seq Scan(全表扫描)、Index Scan / Index Only Scan(索引扫描)、Bitmap Heap Scan、Nested Loop / Hash Join / Merge Join(连接方式)、Sort(排序)、Aggregate(聚合)。

待补充(TODO)
  • 补充:什么信号说明有问题(全表扫大表、行数估算偏差 10 倍以上、磁盘排序)
  • 补充:统计信息与 ANALYZE、自动清理的关系
  • 补充:常见优化手段(加索引、改写 SQL、调整统计目标)的对照示例
  • 补充:线上采集慢 SQL 的方法(pg_stat_statements / auto_explain)