关系型数据库清理
VACUUM 是什么?
回收被旧版本占用的空间,否则表会一直膨胀
类比:定期整理房间,把不要的东西清出去
为什么必须有它
PG 的 UPDATE 是“写新版本、旧的留着”,因为可能还有别的事务需要看旧版本。这些旧版本(死元组)不清理就一直占着数据页,表和索引只增不减,扫描越来越慢——这就是表膨胀。
VACUUM 做三件事
它不只是“打扫卫生”。
- 回收死元组占用的空间,标记为可复用(普通 VACUUM 不还给操作系统)
- 更新统计信息(配合 ANALYZE),让优化器选对执行计划
- 推进 XID 的冻结(freeze),防止事务 ID 回卷导致数据库强制停机
autovacuum 为什么没生效
常见原因:长事务或长查询持有快照,导致死元组无法回收;表太大超过触发阈值;autovacuum 进程数不够被其他表占满。监控 `pg_stat_user_tables` 的 n_dead_tup 和 last_autovacuum 能提前发现问题。