PostgreSQL技术内幕22:vacuum full 和 vacuum

文章目录

    • 0.简介
    • 1.概念及使用方式
    • 2.工作原理
      • 2.1 主要功能
      • 2.2 清理流程
      • 2.3 防止事务id环绕说明
    • 3.使用建议

0.简介

在之前介绍MVCC文章中介绍过常见的MVCC实现的两种方式,一种是将旧数据放到回滚段,一种是直接生成一条新数据(对于删除是不删除),PG采用的是第二种,虽然实现上较为清晰简单,但面临着数据膨胀的问题。本文将介绍其清理命令vacuum,主要包含概念和使用方式,以及实现原理。

1.概念及使用方式

vacuum是一个SQL命令,可以进行垃圾回收并选择性的分析数据库,其语法如下,主要看full和analyze,full的作用下面会详细介绍,analyze的作用就是同时收集表内容的统计信息,结果放在pg_statistic系统目录中,然后查询计划就能使用这个信息去制定高效的计划。

VACUUM [ ( option [, ...] ) ] [ table_and_columns [, ...] ]
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ table_and_columns [, ...] ]where option can be one of:FULL [ boolean ]FREEZE [ boolean ]VERBOSE [ boolean ]ANALYZE [ boolean ]DISABLE_PAGE_SKIPPING [ boolean ]SKIP_LOCKED [ boolean ]INDEX_CLEANUP { AUTO | ON | OFF }PROCESS_MAIN [ boolean ]PROCESS_TOAST [ boolean ]TRUNCATE [ boolean ]PARALLEL integerSKIP_DATABASE_STATS [ boolean ]ONLY_DATABASE_STATS [ boolean ]BUFFER_USAGE_LIMIT sizeand table_and_columns is:table_name [ ( column_name [, ...] ) ]

2.工作原理

2.1 主要功能

1)清理失效元组。
2)生成分析数据
3)更新VM(visibility map)。
4) 防止事务id环绕。

2.2 清理流程

其流程如下:
在这里插入图片描述

  1. 清理失效元组第一步是要识别出那些是失效元组,在之前的MVCC中介绍过,其有xmin和xmax,xmax表示被那个事务删除,如果已经提交了且没有小于xmax的事务继续执行,那么就说明这个元组失效,知道怎么查找失效元组后我们看清理步骤。
    找到dead tuples后会构建该表的dead tuples的链表,该链表存储在缓存中,然后会去移除dead tuples指向的index。这步也就是先清理index。
  2. 移除完index后就需要开始处理其本身,在这不使用vacuum和vacuum full存在区别,vacuum只是去把dead tuples的部分标记为可重用空间然后整理其剩余元组将其重新排列,也就是表的实际空间并没有减少,只是可以重用了;而vacuum full是将目标表有效tuples拷贝到新表中然后删除目标表,然后重建索引。
  3. 删除完dead tuples后就需要更新VM和FSM,这两个的作用在前面文章PG逻辑存储层级和物理存储结构中有描述。
  4. 最后就是可以更新统计信息及相关系统表。

2.3 防止事务id环绕说明

PG的事务id是32位的,最多就是2的32次方,也就是4294967296,所以其采用的是循环利用的方式,同时MVCC是比较依赖事务ID,如果插入的XID大于当前事务XID的行版本,那么就是将来的事务,对当前事务不可见。有以上两个基础,不难想象如果运行足够长的时间,xid计数器会变为0,可能会导致所有以前的数据都被认为是未来的,也就是所有数据都看不到(这只是事务id回卷的一种场景),PG解决这种场景的方式是通过vacuum,识别存在很长时间的数据将其记录为FREEZE,这些数据不遵循XID比较原则,对所有事务可见。

在这里插入图片描述

3.使用建议

可以看见Vacuum比较于Vacuum full有着更快的执行速度,但其不能减小膨胀后的空间,运行时FREEZE很老的记录。而Vacuum full能回收更多空间,但其运行缓慢,运行后所有记录都被FREEZE,其需要全程加独占锁,不推荐生产环境使用。
处理上述两种主动清理,PG还支持字段清理,即Autovacuum,其可以根据需要设置使用在晚上(使用较少时)执行清理,尽可能减少影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/2005.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#,图片分层(Layer Bitmap)绘制,反色、高斯模糊及凹凸贴图等处理的高速算法与源程序

1 图像反色Invert 对图像处理的过程中会遇到一些场景需要将图片反色,反色就是取像素的互补色,比如当前像素是0X00FFFF,对其取反色就是0XFFFFFF – 0X00FFFF 0XFF0000,依次对图像中的每个像素这样做,最后得到的就是原…

STM32 FreeRTOS 的任务挂起与恢复以及查看任务状态

目录 任务的挂起与恢复的API函数 任务挂起函数 任务恢复函数 任务恢复函数(中断中恢复) 函数说明 注意事项 查看任务状态 任务的挂起与恢复的API函数 vTaskSuspend():挂起任务, 类似暂停,可恢复 vTaskResume()&#xff1a…

vscode 扩展Cline、Continue的差别?

Cline和Continue都是VSCode的AI编程插件,它们在功能、用户体验、性能、适用场景以及配置和使用步骤等方面存在一些差别: 一、功能差异 编辑功能 Cline:能够分析项目的文件结构和源代码抽象语法树(AST),通…

Unity 3D游戏开发从入门进阶到高级

本文精心整理了Unity3D游戏开发相关的学习资料,涵盖入门、进阶、性能优化、面试和书籍等多个维度,旨在为Unity开发者提供全方位、高含金量的学习指南.欢迎收藏。 学习社区 Unity3D开发者 这是一个专注于Unity引擎的开发者社区,汇聚了众多Un…

LLM实现视频切片合成 前沿知识调研

1.相关产品 产品链接腾讯智影https://zenvideo.qq.com/可灵https://klingai.kuaishou.com/即梦https://jimeng.jianying.com/ai-tool/home/Runwayhttps://aitools.dedao.cn/ai/runwayml-com/Descripthttps://www.descript.com/?utm_sourceai-bot.cn/Opus Cliphttps://www.opu…

1Hive概览

1Hive概览 1hive简介2hive架构3hive与Hadoop的关系4hive与传统数据库对比5hive的数据存储 1hive简介 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。 其本质是将SQL转换为MapReduce/Spark的任务进…

IDEA的Java注释在Toggle Rendered View下的字号调整方式

记录IntelliJ IDEA的Java注释在Toggle Rendered View下的字号调整方式 如图,在Toggle Rendered View模式下的注释字号很大,与代码不协调,在此区域点击鼠标右键,选中 Adjust 出现一个滑动条,通过拖动游标调整字号大小…

游戏市场成果及趋势

2024 年的游戏行业发展情况如何?这是一个既关系到开发商,又关系到玩家的问题,而市场分析师可以为我们揭晓答案。下面,就让我们来看看分析师给出的结论以及他们对未来趋势的预测。 玩家 自 2021 年起,全球平均游戏时间…

C++复习

注:本文章所写内容是小编复习所看的。记录的是一些之前模糊不清的知识点。详细c内容请移步至小编主页寻找。 竞赛小技巧 竞赛中cin/cout用不了(没有办法刷新缓冲区,导致cin/cout与缓冲区绑定) 解决办法:(加以下三行…

【C++】多线程

目录 多线程基础什么是线程线程和进程的关系线程的特点什么是多线程编程为什么要使用多线程线程与CPU的执行关系线程的生命周期 创建线程(C11)线程的可调用对象传参数 注意事项join和detach的区别一个线程包含什么东西this_thread 线程同步线程同步机制互…

《深度剖析算法优化:提升效率与精度的秘诀》

想象一下,你面前有一堆杂乱无章的数据,你需要从中找到特定的信息,或者按照一定的规则对这些数据进行排序。又或者,你要为一个物流公司规划最佳的配送路线,以降低成本和提高效率。这些问题看似复杂,但都可以…

怎么实现Redis的高可用?

大家好,我是锋哥。今天分享关于【怎么实现Redis的高可用?】面试题。希望对大家有帮助; 怎么实现Redis的高可用? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 为了实现 Redis 的高可用性,我们需要保证在发…

【CSS】HTML页面定位CSS - position 属性 relative 、absolute、fixed 、sticky

目录 relative 相对定位 absolute 绝对定位 fixed 固定定位 sticky 粘性定位 position:relative 、absolute、fixed 、sticky (四选一) top:距离上面的像素 bottom:距离底部的像素 left:距离左边的像素…

使用docker-compose安装Redis的主从+哨兵模式

必看 本文是一主二从一哨兵模式;其余的单机/集群/多哨兵模式的话,不在本文... 本文的环境主要是:应用app在本地,redis在云服务器上; 图解 图如下:这个图很重要; 之所以要这样画图&#xff0…

深度剖析RabbitMQ:从基础组件到管理页面详解

文章目录 一、简介二、Overview2.1 Overview->Totals2.2 Overview->Nodesbroker的属性2.3 Overview->Churn statistics2.4 Overview->Ports and contexts2.5 Overview->Export definitions2.6 Overview->Import definitions 三、Connections连接的属性 四、C…

[0405].第05节:搭建Redis主从架构

Redis学习大纲 一、3主3从的集群配置: 1.1.集群规划 1.分片集群需要的节点数量较多,这里我们搭建一个最小的分片集群,包含3个master节点,每个master包含一个slave节点,结构如下: 2.每组是一主一从&#x…

QT在 MacOS X上,如何检测点击程序坞中的Dock图标

最近在开发MacOS的qt应用,在做到最小化系统托盘功能时,发现关闭窗口后再次点击程序坞中的Dock图标不能将主界面再显示出来。查询里很多资料,发现是QT自身的问题,没有做相关的点击Dock图标的处理。 于是我参考了国内和国外的这两篇…

Flutter插件制作、本地/远程依赖及缓存机制深入剖析(原创-附源码)

Flutter插件在开发Flutter项目的过程中扮演着重要的角色,我们从 ​​​​​​https://pub.dev 上下载添加到项目中的第三方库都是以包或者插件的形式引入到代码中的,这些第三方工具极大的提高了开发效率。 深入的了解插件的制作、发布、工作原理和缓存机…

每日学习30分轻松掌握CursorAI:Cursor插件系统与扩展功能

Cursor插件系统与扩展功能 一、课程概述 今天我们将学习Cursor AI的插件系统,了解如何通过插件扩展和增强IDE功能。由于Cursor AI基于VS Code开发,我们可以利用丰富的VS Code插件生态系统。 1.1 学习目标 了解插件系统原理掌握插件安装管理使用常用开…

第G1周:生成对抗网络(GAN)入门

>- **🍨 本文为[🔗365天深度学习训练营]中的学习记录博客** >- **🍖 原作者:[K同学啊]** 本人往期文章可查阅: 深度学习总结 基础任务 1.了解什么是生成对抗网络2.生成对抗网络结构是怎么样的3.学习本文代码&am…