作者:阎书利
vacuum是一种维护过程,有助于PostgreSQL的持久运行,它的两个主要任务是删除死元组,以及冻结事务标识。
vacuum的作用:
1.释放,再利用更新/删除的行所占据的磁盘空间。
2.更新postgresql查询计划中使用的统计数据。
3.防止因事务ID的重置而使非常老的数据丢失。
并发清理过程为指定的表或者数据库中的表执行以下任务:
第一部分
1.从指定的表中依次处理每一张表,
2.获取表上的ShareUpdateExclusiveLock锁(该锁允许其他事物对该表进行读取)。
3.扫描表中的所有页面,获取所有的死亡元组,(死元组的列表存储在本地内存的maintenance_work_mem里)
4.如果有必要,冻结旧的元组的事务标识
5.移除指向死亡元组的索引元组
第二部分
1.移除每一页中的死亡元组,并对每一页内的的活元组进行碎片整理,重排本页的活元组
2.更新已经处理的空闲空间映射(FSM)和可见性映射(VM)
PG会不断执行这个过程直至最后一页
第三部分
1.如果最后一个页面没有任何元组,则截断最后一页
2.更新与冻结事务标识相关的系统视图(pg_class与pg_database)
3.释放ShareUpdateExclusiveLock锁
第四部分
1.更新一些统计信息(pg_stat_all_tables等)
2.移除不必要的提交日志文件,移除CLOG(10版本及以后为xact)中的非必要文件与页面
(当更新p