统计信息与 EXPLAIN

先看计划

EXPLAIN (ANALYZE, BUFFERS)
SELECT id, status
FROM app_schema.orders
WHERE user_id = 42;

只看形状用 EXPLAIN,不带 ANALYZE。高峰、会改数据的 SQL,不要随手 ANALYZE。

读计划时盯:

  • Seq Scan 是否不该出现
  • 行数估计和实际差很多
  • Sort / Hash 是否洒到磁盘(work_mem
  • Nested Loop 外表过大

统计

SELECT relname, last_analyze, last_autoanalyze, n_mod_since_analyze
FROM pg_stat_user_tables
WHERE schemaname = 'app_schema';
ANALYZE app_schema.orders;

扩展统计(相关列)在多列过滤经常估错时再考虑,不是第一反应。

注意

SET enable_seqscan = off 只适合验证,不要当生产调优。生产靠索引、统计、SQL 改写。work_mem 是每个操作节点的内存,连接一多会放大。

参考:Using EXPLAIN