6. 清理过程

目录

1. 并发清理过程

2. 可见性映射

3. 冻结过程

惰性模式:

​编辑迫切模式:

改进迫切模式:

4. 移除不必要的CLOG文件

5. 自动清理守护进程

6. 完整清理


1. 并发清理过程

并发清理的过程如下:

  1. 扫描表,并生成死元组列表(也就是删除、更新前、以及事务已回滚的元组,如果将这些元组删了,那么之前那些多余的事务id与状态确实没有存在的必要了,之前的疑惑是,元组还在,事务状态没了,这种方法的话,只会留下有用的元组)。删除指向这些死元组的索引。冻结一些很久以前的元组,使操作其的事务不会成为一些事务的未来事务,注意这些元组对应的事务的clog还是存在的。冻结的元组对所有事务都有可见性,你可能会觉得,那一些被更新的元组,它应该对所有事务都不具有可见性,冻结的话,不就破坏了更新不可见的规则了吗?注意,删除死元组在先,如果一个元组被更新了,那么它已经被删除了。也就是说可见元组中是不存在死元组的。
  2. 删除死元组与这些死元组对应的不必要的clog,但是不用删除指向元组的指针,如果一个指针被删了,那么该指针后面的指针下标都要前移,那么会导致大量的索引变化,而不是仅删除一个索引。留下指向死元组的指针,后面可以重复利用的。更新FSM(空闲空间映射,记录页中在删除了死元组后的空闲空间)与VM(可见性映射,表示页面中元组的可见性以及是否有死元组,比如元组全都被冻结的页面对任意事务都有可见性)。
  3. 更新一些系统的统计信息。如果最后一页为空,则表从该页截断。

2. 可见性映射

VM,可见性映射,是为了减少冻结与清理的时间。

页面的可见性确定了每个页面是否包含死元组,清理过程可以跳过没有死元组的页面。后面版本的Pg中,VM也包含页面是否全部冻结的信息。

3. 冻结过程

惰性模式:

根据VM扫描清理包含死元组的表。过程:

根据VM,扫描不可见页面,根据a=b-c,b为当前事务id,c为固定值,可配置,a及之前的事务元组都需要被冻结,并一边移除死元组。当一个页面中所有元组都被冻结,那么该页面也就是一个可见页面。

惰性模式不能动结那些很久以前但是没有死元组的事务元组页。

迫切模式:

 扫描所有的表,并删除不必要clog

为了弥补惰性清理的缺点,迫切模式扫描所有元组,不管是全页可见的还是不可见的(因为它根本不会根据VM可见性来扫描),冻结的还是没冻结的,比如,冻结完一章表中10200事务之前的元组后,更新该表的f值,表示该表最新的不可见的事务Id为10200。而整个数据库的F值为所有表的最小f值。

迫切模式的缺点是,即使一个页已经全员可见了,还是会扫描一遍。

改进迫切模式:

9.6版为了改进迫切模式,改进后的迫切模式会先扫描VM,并会跳过已经全员可见的页(即全员已经被冻结,在重复一遍,被冻结不会有死元组)

4. 移除不必要的CLOG文件

上面提到的数据库中的F值存储这所有数据表中最旧的可能存在不可见元组的事务id,即事务id之前的事务所操作的元组已经全部可见,不可见的元组也已全部被清理,那么存储事务id之前的clog文件与页面就可以被删除了。

5. 自动清理守护进程

系统每隔一段时间(默认情况为每分钟一次,可配置)启动一次自动并发清理。

6. 完整清理

前面说的都是并发清理,但是并发清理之后还得整理:

创建新的表,将活元组从各个页面中复制到新表,删除旧文件,重建索引并更新统计信息FSM与VM。这个是很耗时的,而且在完整清理时其他事务不能访问表。

何时启动完整清理:通过pg_freespacemap扩展查看各个页的空置率来决定。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值