摘要: 在 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)删除长期表:索引重建实现后,会将带有老物理文件的长期表进行删除。
点击关注,第一工夫理解华为云陈腐技术~