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)