1. EXPLAIN ANALYZE 与 EXPLAIN 的差异,实际执行 vs 估算?
请说明 PostgreSQL 中 EXPLAIN 与 EXPLAIN ANALYZE 的区别,它们分别返回估算信息与实际执行统计,各自适合什么场景?
- EXPLAIN 只做计划生成,不执行 SQL,输出的是优化器基于统计信息的估算值。
- EXPLAIN ANALYZE 会真正执行 SQL,输出每个节点的实际行数、实际耗时与循环次数。
- 两者结合可以暴露估算误差与执行瓶颈。
EXPLAIN 只生成并展示执行计划,不执行查询,因此输出的是优化器基于表统计信息估算的 cost、rows、width,其代价是"打印计划"而非"执行"。EXPLAIN ANALYZE 会真实执行该语句并测量每个节点实际处理的行数(actual rows)、实际耗时(actual time,毫秒)、循环次数(loops),同时在计划末尾输出 Planning Time、Execution Time 与总耗时。两者对比时,若 actual rows 与 estimated rows 差距很大,说明统计信息过旧或估算模型失效,需要 ANALYZE 更新统计或调整代价参数。实际工作中常用 EXPLAIN ANALYZE 定位慢节点,用 EXPLAIN 快速评估计划形态而不触发副作用。
EXPLAIN ANALYZE 会执行语句,因此对 DML(INSERT/UPDATE/DELETE)会真正修改数据,需要格外小心;只读查询可安全使用。它提供的"真实"信息能验证优化器估算是否准确,是调优的最直接手段。
EXPLAIN SELECT * FROM orders WHERE user_id = 100;
EXPLAIN ANALYZE SELECT * FROM orders WHERE user_id = 100;