GaussDB(DWS) VACUUM总结

网友投稿 1010 2022-05-28

GaussDB(DWS) VACUUM总结

摘要:在GaussDB(DWS)中,VACUUM的本质就是一个“吸尘器”,用于吸收“尘埃”。而尘埃其实就是旧版本数据,如果这些数据没有及时清理,那么将会导致数据库空间膨胀,性能下降,更严重的情况会导致宕机。下面将从VACUUM的作用、用法、原理等方面进行介绍。

1 VACUUM的作用

1)空间膨胀问题:清除废旧元组以及相应的索引。包括提交的事务delete的元组(以及索引)、update的旧版本(以及索引),回滚的事务insert的元组(以及索引)、update的新版本(以及索引)、copy导入的元组(以及索引)。

2)freeze:防止因事务ID回卷问题(Transaction ID wraparound)而导致的宕机,将小于OldestXmin的事务号转化为freeze xid,更新表的relfrozenxid,更新库的relfrozenxid,truncate clog。

3)更新统计信息:VACUUM analyze时,会更新统计信息,使得优化器能够选择更好的方案执行sql。

2 VACUUM命令

VACUUM 命令存在两种形式,VACUUM和VACUUM FULL,VACUUM命令做的是LAZY VACUUM。从字面意思就可以看出来,LAZY VACUUM是VACUUM FULL的简化版。具体区别见下表。

LAZY VACUUM

VACUUM FULL

空间清理

如果删除的记录位于表的末端,其所占用的空间将会被物理释放并归还操作系统。而如果不是末端数据,会将表中或索引中dead tuple(死亡元组)所占用的空间置为可用状态,从而复用这些空间

不论被清理的数据处于何处,这些数据所占用的空间都将被物理释放并归还于操作系统。当再有数据插入后,分配新的磁盘页面使用

锁类型

共享锁,可以与其他操作并行

排他锁,执行期间基于该表的操作全部挂起

物理空间

不会释放

会释放

事务ID

不回收

回收

执行开销

开销较小,可以定期执行

开销巨大,建议确认数据库所占磁盘页面空间接近临界值再执行操作,且最好选择数据量操作较少的时段完成

执行效果

执行后会有所提升

执行完后,基于该表的操作效率大大提升

注:目前LAZY VACUUM只对行存表起作用,对列存表无效,列存表只能依靠VACUUM FULL释放空间。

VACUUM在GaussDB(DWS)中具体执行语法如下:

1)回收空间并更新统计信息,对关键字顺序无要求

VACUUM [ ( { FULL | FREEZE | VERBOSE | ANALYZE } [, ...] ) ] [ table_name [ (column_name [, ...] ) ] ]

2)仅回收空间,不更新统计信息

VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ table_name ]

3)回收空间并更新统计信息,且对关键字顺序有要求

VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] ANALYZE [ table_name [ (column_name [, ...] ) ] ]

重要参数说明:

FULL 选择VACUUM FULL清理,可以恢复更多空间,但耗时更多。

FREEZE指定FREEZE相当于执行VACUUM时将VACUUM_freeze_min_age参数设为0。

VERBOSE为每个表打印一份详细的清理工作

ANALYZE | ANALYSE更新用于优化器的统计信息,以决定执行查询的最有效方法。

3 VACUUM原理

3.1 LAZY VACUUM执行流程

(1)从指定的多张表中进行遍历,从而获取每一个表。

GaussDB(DWS) VACUUM总结

(2)获取遍历到表的共享锁,该锁允许其他事务读取。

(3)获取每个页面的dead tuples(死亡元组),并freeze需要的元组。

(4)删除指向dead tuples的元组。

(5)删除dead tuples并重新分配live tuples(活动元组)。

(6)更新目标表的FSM(用于记录每个数据块的空闲空)和VM(标记数据块中是否存在需要清理的行)。

(7)重复5,6步骤直到遍历完该表的每一页.

(8)如果最后一页没有元组,则进行截断。

(9)更新与VACUUM有关的统计信息表和系统目录。

3.2 VACUUM FULL执行流程

(1)建立临时表:数据库创建一张临时表,该表继承老表的所有属性。如果用户表有名字与这个临时表相同的,那么就会失败。在该阶段申请的行排他锁(RowExclusiveLock)。

(2)数据复制:将原来表中的数据复制到临时表中。在该过程中完成堆dead tuples的清理。该阶段申请的是访问排他锁AccessExclusiveLock。

(3)交换表:使用新表代替老表。而交换的本质是物理文件的交换,即临时表带老物理文件,老表带新物理文件。该阶段会再次申请行排他锁(RowExclusiveLock)。

(4)重建索引:当交换完成后,会进行索引重建,并更新统计信息。此时对表申请共享锁(ShareLock)。

(5)删除临时表:索引重建完成后,会将带有老物理文件的临时表进行删除。

EI企业智能 Gauss AP 数据仓库服务 GaussDB(DWS)

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:TKinter项目-屏保
下一篇:Python技能树每日一练——文件操作
相关文章