Vast+产品展厅 | 提高空间利用率,浅析Vastbase 清理过程

企业数据激增,数据库清理过程(简称:VACUUM)是一个重要的维护方式。它可以提高数据质量,保证Vastbase持久运行。VACUUM的两个主要任务是删除死元组冻结事务标识

本期Vast+产品展厅,让我们一起了解下VACUUM的实现方式和处理过程。


1、为什么需要VACUUM?

Vastbase独特的MVCC实现方式,需要引入VACUUM清理留下的死元组,便于空间复用、避免空间膨胀。

MVCC实现方式就像信用卡,删除、更新和回滚留下的“债务”需要去偿还,偿还的动作就是由VACUUM来做的,如果不偿还就会导致破产。

移除死元组有两种清理模式:并发清理完整清理

并发清理会删除表文件每个页面中的死元组,而其他事务可以在其运行期间继续读取该表。

相反,完整清理不仅会移除整个文件中的所有死元组,还会对整个文件中的所有的活元组进行碎片整理;其他事务在完整清理运行期间无法访问该表。

2、并发清理

并发清理为指定的表或数据库中的所有表执行如下任务:

1 移除死元组

(1)移除指向死元组的索引元组;

(2)移除每一页中的死元组,并对每一页内的活元组进行碎片整理。

2 冻结旧的事务标识

(1)如有必要,冻结旧元组的事务标识;

(2)更新与冻结事务标识相关的系统视图(pg_database与pg_class);

(3)如果可能,移除非必需的提交日志(clog)。

3 移除死元组

(1)更新已处理表的空闲空间映射(FSM)和可见性映射(VM);

(2)更新一些统计信息(pg_stat_all_tables等)。

|伪码

(1)     FOR each table

(2)         在目标表上获取 ShareUpdateExclusiveLock 锁

 

            /* 第一部分 */

(3)         扫描所有页面,定位死元组;如有必要,冻结过老的元组。

(4)         如果存在,移除指向死元组的索引元组。

 

            /* 第二部分 */

(5)         FOR each page of the table

(6)             移除死元组,重排本页内的活元组。

(7)             更新 FSM 与 VM

            END FOR

 

            /* 第三部分 */

(8)         如果可能,截断最后的页面。

(9)         更新系统数据字典与统计信息

            释放ShareUpdateExclusiveLock锁

        END FOR

 

        /* 后续处理 */

(10)    更新统计信息与系统数据字典

(11)     如果可能,移除没有必要的文件,以及clog中的文件。

|说明

1、从指定的表集中依次处理每一张表;

2、获取表上的ShareUpdateExclusiveLock锁, 此锁允许其他事务对该表进行读取;

3、扫描表中所有的页面,以获取所有的死元组,并在必要时冻结旧元组;

4、删除指向相应死元组的索引元组(如果存在);

5、对表的每个页面执行步骤6和7中的操作;

6、移除死元组,并重新分配页面中的活元组;

7、更新目标表对应的FSM与VM;

8、如果最后一个页面没有任何元组,则截断最后一页;

9、更新与目标表清理过程相关的统计数据和系统视图;

10、更新与清理过程相关的统计数据和系统视图;

11、如果可能,移除clog中非必需的文件与页面。

该伪码分为依次处理表的循环后续处理逻辑,循环块又能分为三个部分,每一个部分都有各自的任务。

  • 第一部分执行冻结过程,并删除指向死元组的索引元组
  • 第二部分移除死元组,并逐页更新FSM和VM
  • 第三部分针对每个表,更新与清理过程相关的统计信息和系统视图

此外,如果最后一页中没有元组,则该页会从表文件中被截断。当处理完成后,Vastbase会更新并清理过程相关的几个统计数据和系统视图;如果可能的话,还会移除部分不必要的CLOG文件。

假设该表包含三个页面,这里先关注0号页面,该页面包含三条元组。

其中Tuple_2是一条死元组,Vastbase移除了Tuple_2,并重排剩余元组来整理碎片空间,然后更新该页面的FSM和VM。 Vastbase不断重复该过程直至最后一页

注意,非必需的行指针是不会被移除的,它们会在将来被重用。因为如果移除了行指针,就必须同时更新所有相关索引中的索引元组。

3、完整清理

虽然并发清理对于运维至关重要,但光有它还不够。如果存在即使删除了许多死元组,也无法压缩表大小的情况,会发生什么呢?

假设一个表由三个页面组成,每个页面包含六条元组。执行DELETE命令删除了其中五条元组,并执行VACUUM命令以移除死元组。死元组虽然都被移除了,但表的尺寸没有减小。 这种情况既浪费了磁盘空间,又会对数据库性能产生负面影响

为了解决这种情况,Vastbase提供了完整清理模式。 

|说明

创建新的表文件:见上图1,当对表执行VACUUM FULL命令时,Vastbase首先获取表上的AccessExclusiveLock锁,并创建一个大小为8 KB的新的表文件。 AccessExclusiveLock锁不允许任何其他访问。

将活元组复制到新表:见上图2,Vastbase只将旧表文件中的活元组复制到新表中。

删除旧文件,重建索引,并更新统计信息,FSM和VM,见上图3,复制完所有活元组后,Vastbase将删除旧文件,重建所有相关的表索引,更新表的FSM和VM,并更新相关的统计信息和系统视图。

伪码

(1)     FOR each table

(2)         获取表上的AccessExclusiveLock锁

(3)         创建一个新的表文件

(4)         FOR 每个活元组 in 老表

(5)将活元组拷贝到新表中

(6)             如果有必要,冻结该元组。

            END FOR

(7)         移除旧的表文件

(8)         重建所有索引

(9)         更新FSM与VM

(10) 更新统计信息

          释放AccessExclusiveLock锁

        END FOR

(11)    移除不必要的clog文件

使用VACUUM FULL命令时,应当考虑两点:

1.当执行完整清理时,没有人可以访问(读/写)表;

2.最多会临时使用两倍于表的磁盘空间,因此在处理大表时,有必要检查剩余磁盘容量。

通过并发清理和完整清理两种方式清除死元组,提升空间利用率和复用率,优化性能、让数据库高效运转。

  • 10
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值