postgresql-vacuum和vacuum full走了几步棋

Vacuum过程

vacuum的执行过程主要分为以下三步:
1. 清除dead tuples指向的index tuples
该过程中,vacuum会顺序扫描目标表,并构建一个dead tuples组成的list链表,该list链表会存储在maintenance_work_mem缓存中。然后vacuum根据dead tuples list移除dead tuples指向的index。
2. 移除dead tuples,更新VM和FSM
这里的移除dead tuples只是标记为可重用该空间,并没有真正物理删除。所以vacuum清理表后,表的实际空间并没有减小。dead tuples在做移除标记后,vacuum会重新排列剩余的元组以进行碎片化整理。然后,需要更新目标表的VM(可见性映射文件)和FSM(空闲空间映射文件)。
3. 更新统计信息和相关系统表
最后,需要更新vacuum目标表的统计信息(以适应最新的查询优化)和相关系统表。


Vacuum Full过程


Vacuum Full和Vacuum最大的不同就是,Vacuum Full是物理删除dead tuples,并把释放的空间重新交给操作系统,所以在vacuum full后,表的大小会减小为实际的空间大小。其处理过程和vacuum大不相同,处理步骤如下:
1.  vacuum full开始执行时,系统会先对目标创建一个AccessExclusiveLock ,不允许外界再进行访问(为后面拷贝做准备),然后创建一个表结构和目标表相同的新表。
2. 扫描目标表,把表中的live tuples 拷贝到新表中。
3. 删除目标表,在新表上,重新创建索引,更新VM, FSM以及统计信息,相关系统表等。
所以,vacuum full的本质是生成一个新的数据文件,然后把原有表的live tuples存放到该数据文件中。对比vacuum, vacuum full缺点就是在执行期间不能对表进行访问,由于需要往新表中导入live tuples数据,其执行效率也会很慢。优点是执行后,表空间只存放live tuples,没有冗余的dead tuples,在执行查询效率上会有所提高。

你可能感兴趣的:(postgresql,数据库,database)