PostgreSQL 的 B-Tree 索引采用 MVCC 机制下的“追加写”策略:更新索引键会插入新条目而非原地修改,旧条目成为死元组(Dead Tuple)。长期高频更新会导致索引页面分裂与表膨胀,必须依赖 VACUUM 回收空间。
一、膨胀检测与自动清理调优
sql
-- 检测表膨胀率
SELECT relname,
pg_size_pretty(pg_total_relation_size(oid)) AS total_size,
n_dead_tup,
ROUND(n_dead_tup::numeric / GREATEST(n_live_tup, 1), 3) AS dead_ratio
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC
LIMIT 10;
-- 关键表开启更激进的 autovacuum 阈值
ALTER TABLE orders SET (
autovacuum_vacuum_scale_factor = 0.02,
autovacuum_analyze_scale_factor = 0.01
);