欢迎访问 内存溢出 —— 独立后端与系统工程技术博客

专注于分布式系统、Linux内核、数据库存储与后端工程实践

PostgreSQL 索引深度剖析:B-Tree 页面分裂与 VACUUM 膨胀治理

发表于:|最后更新:|分类:数据库与存储|阅读:7546 次

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
);