带你了解数据库的“吸尘器”:VACUUM
摘要:在GaussDB(DWS)中,VACUUM的本质就是一个“吸尘器”,用于吸收“尘埃”。 下面将从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释放空间。
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)删除临时表:索引重建完成后,会将带有老物理文件的临时表进行删除。
本文分享自华为云社区《GaussDB(DWS) VACUUM总结》,原文作者:KevinMV 。
带你了解数据库的“吸尘器”:VACUUM的更多相关文章
- CentOS6.5下卸载自带的MySQL数据库安装MySQL5.6
1)查看CentOS自带的mysql 输入 rpm -qa | grep mysql mysql-libs-5.1.71-1.el6.x86_64 2)将其自带的mysql版本全部卸载(非常重要,如不 ...
- 带你了解数据库中事务的ACID特性
前言 前面我们介绍过数据库中 带你了解数据库中JOIN的用法 与 带你了解数据库中group by的用法的相关用法.本章节主要来介绍下数据库中一个非常重要的知识点事务,也是我们项目中或面试中经常会遇到 ...
- 带你了解数据库中group by的用法
前言 本章主要介绍数据库中group by的用法,也是我们在使用数据库时非常基础的一个知识点.并且也会涉及Join的使用,关于Join的用法,可以看我写的上一篇文章:带你了解数据库中JOIN的用法如有 ...
- 启用CentOS6.5 64位安装时自带的MySQL数据库服务器
本人在虚拟机上又安装了一台linux机器,作为MySQL数据库服务器用,在安装时选择了系统自带的MySQL服务器端,以下是启用步骤. 首先开启mysqld服务 #service mysqld star ...
- Android内部自带的SQLite数据库操作dos命令
1:什么叫做SQLite数据库 Android系统内核是Linux系统,Android系统很特殊,他自带了一个SQLite数据库,轻量型的一款嵌入式的数据库 它占用资源非常的低,在嵌入式设备中,可能只 ...
- 访问Tableau自带的PostgreSQL数据库
突然发现公司Tableau服务器的数据库大小急剧增加,因此决定直接连上数据库排查.过程记录如下:最后发现有个http_requests 表体积巨大(7G),本来以为是数据缓存什么的.结果是日志问题o( ...
- Mysql数据库自带四个数据库的解析
1. information_schema详细介绍: information_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式.什么是元数据呢?元数据是关于数据的数据,如数据 ...
- 带你了解数据库中JOIN的用法
前言 欢迎关注公众号:Coder编程 获取最新原创技术文章和相关免费学习资料,随时随地学习技术知识! 本章主要介绍数据库中Join的的用法,也是我们在使用数据库时非常基础的一个知识点.本次会介绍数据库 ...
- 大哥带的Orchel数据库的注入
0X01 先进行判断 a.jsp?username=SMITH and = 发现单引号闭合 我们尝试构造闭合 存在注入 a.jsp?username=SMITH'='1 正确 a.jsp?user ...
- GitHub 热点速览 Vol.26:手把手带你做数据库
作者:HelloGitHub-小鱼干 摘要:手把手带你学知识,应该是学习新知识最友好的姿势了.toyDB 虽然作为一个"玩具"项目不能应用在实际开发中,但通过它你可以了解到如何制作 ...
随机推荐
- 【SqlServer】存储过程:批量查询数据库下表的元数据
一.查询单张表 1.1 根据表名查询表结构 --快速查看表结构(比较全面的) DECLARE @tableName NVARCHAR(MAX); SET @tableName = N'YMUS'; - ...
- linux 批量替换文件内容
1.批量查找某个目下文件的包含的内容,例如: # grep -rn "要找查找的文本" ./ 2.批量查找并替换文件内容. # sed -i "s/要找查找的文本 ...
- [ABC276Ex] Construct a Matrix
没有题解,所以来写一篇. Description 构造一个 \(N\times N\) 的矩阵 \(A\),其中 \(A_{i,j}\in {0,1,2}\),要求同时满足 \(Q\) 条限制. 每条 ...
- 手撕Vuex-Vuex实现原理分析
本章节主要围绕着手撕 Vuex,那么在手撕之前,先来回顾一下 Vuex 的基本使用. 创建一个 Vuex 项目,我这里采用 vue-cli 创建一个项目,然后安装 Vuex. vue create v ...
- 聊一聊 tcp/ip 在.NET故障分析的重要性
一:背景 1. 讲故事 这段时间分析了几个和网络故障有关的.NET程序之后,真的越来越体会到计算机基础课的重要,比如 计算机网络 课,如果没有对 tcpip协议 的深刻理解,解决这些问题真的很难,因为 ...
- 编译wasm Web应用
刚学完WebAssembly的入门课,卖弄一点入门知识. 首先我们知道wasm是目标语言,是一种新的V-ISA标准,所以编写wasm应用,正常来说不会直接使用WAT可读文本格式,更不会用wasm字节码 ...
- nodejs 实现MQTT协议的服务器端和客户端的双向交互
一.项目背景 公司和第三方合作开发一个传感器项目,想要通过电脑或者手机去控制项目现场的传感器控制情况.现在的最大问题在于,现场的边缘终端设备接入的公网方式是无线接入,无法获取固定IP,所以常规的HTT ...
- C语言实现输入的时间,屏幕显示一秒后的时间。显示格式为HH:MM:SS。
#include <stdio.h> int main() { int HH, MM, SS; scanf("%d:%d:%d",&HH,&MM,&am ...
- 百度API学习 | day01
大作业:(2023.12.27日完成) 各位同学可根据自身情况进行选择: 选项一:根据实验一.二.三完成如下任务: 任务一:基于Jfinal构建信息管理系统,要求包含用户管理,翻译业务模块管理,图片优 ...
- 10个PPT制作实用小技巧
当制作PPT时,您可以使用一些实用的小技巧来提升演示效果和工作效率.以下是10个PPT制作实用小技巧的详细描述: 第一.选择合适的模板 选择合适的PPT模板非常重要,因为模板可以决定整个演示的风格和视 ...