摘要:在GaussDB(DWS)中,VACUUM的实质就是一个“吸尘器”,用于排汇“尘埃”。 上面将从VACUUM的作用、用法、原理等方面进行介绍。
本文分享自华为云社区《GaussDB(DWS) VACUUM总结》,原文作者:KevinMV 。
在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开释空间。
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)从指定的多张表中进行遍历,从而获取每一个表。
(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)删除长期表:索引重建实现后,会将带有老物理文件的长期表进行删除。
点击关注,第一工夫理解华为云陈腐技术~