第六章 清理过程(VACUUM)

清理(VACUUM)是一种维护过程,有助于PostgreSQL的持久运行。它的两个主要任务是删除死元组,以及冻结事务标识,两者都在第5.10节中简要提到过。

为了移除死元组,清理过程有两种模式:并发清理(Concurrent Vacuum) 与完整清理(Full Vacuum) 。并发清理(通常简称为VACUUM)会删除表文件每个页面中的死元组,而其他事务可以在其运行时继续读取该表。相反,完整清理不仅会移除整个文件中所有的死元组,还会对整个文件中所有的活元组进行碎片整理。而其他事务在完整清理运行时无法访问该表。

尽管清理过程对PostgreSQL至关重要,但与其他功能相比,它的改进相对其他功能而言要慢一些。例如在8.0版本之前,清理过程必须手动执行(通过psql实用程序或使用cron守护进程)。直到2005年实现了autovacuum守护进程时,这一过程才实现了自动化。

由于清理过程涉及到全表扫描,因此该过程代价高昂。在版本8.4(2009)中引入了可见性映射(Visibility Map, VM)来提高移除死元组的效率。在版本9.6(2016)中增强了VM,从而改善了冻结过程的表现。

6.1节概述了并发清理的过程,而后续部分的内容如下所示:

1. 可见性映射
2. 冻结(Freeze)过程
3. 移除不必要的clog文件
4. 自动清理(AutoVacuum)守护进程
5. 完整清理