写点什么

带你了解数据库的“吸尘器”:VACUUM

发布于: 2021 年 03 月 24 日

摘要:在 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.1LAZY 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.2VACUUM FULL 执行流程


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

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

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

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

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


点击关注,第一时间了解华为云新鲜技术~


发布于: 2021 年 03 月 24 日阅读数: 12
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
带你了解数据库的“吸尘器”:VACUUM