Vacuum at the Page Level
7 days ago
- #PostgreSQL VACUUM
- #Dead Tuple Cleanup
- #Line Pointer Lifecycle
- VACUUM 操作分为三个阶段:堆扫描与清理(第一阶段)、索引清理(第二阶段)和堆清理(第三阶段),通过回收死元组空间并管理行指针状态来优化存储。
- 行指针状态在索引和HOT更新的作用下进行转换(LP_NORMAL、LP_DEAD、LP_UNUSED);清理操作回收元组存储空间,而索引清理则允许LP_DEAD槽位变为LP_UNUSED。
- 空闲空间映射(FSM)用于跟踪VACUUM后回收的空间,使新的INSERT操作能够复用空间而非扩展表文件,而可见性映射支持仅索引扫描和高效的VACUUM轮次。
- VACUUM FREEZE 会将元组标记为已冻结,以防XID回绕,并更新可见性映射的all_frozen位,同时推进表的冻结界限。
- 常规 VACUUM 是轻量级操作,可以截断尾部的空页,但若需压缩内部空闲空间,则需使用 VACUUM FULL,尽管会带来锁和性能方面的权衡。