统计信息与 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 是每个操作节点的内存,连接一多会放大。