VACUUM 剖析

2024-06-19 18:36
文章标签 剖析 vacuum

本文主要是介绍VACUUM 剖析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

VACUUM 剖析

为什么需要 Vacuum

MVCC

MVCC:Multi-Version Concurrency Control,即多版本并发控制。

PostgreSQL 使用多版本并发控制(MVCC)来支持高并发的事务处理,同时保持数据的一致性和隔离性。MVCC 是一种用于管理数据库并发操作的技术,它允许多个事务同时访问同一数据,而不会产生冲突或阻塞。

MVCC 的工作原理
  1. 版本化

    PostgreSQL 为表中的每行数据存储多个版本。当一个事务更新一行数据时,它不会立即覆盖原始数据,而是创建该数据的新版本。

  2. 事务ID
    每个事务被分配一个唯一的事务ID(XID),该ID 用于跟踪数据的变更。

  3. 快照
    当一个事务开始时,它会创建一个快照,该快照是数据库在某一时刻的状态。即使其他事务在该事务进行时对数据进行了更改,该事务仍然可以看到它开始时的数据库状态。

  4. 可见性规则
    MVCC 通过一组可见性规则来确定事务可以看到哪些数据版本。通常,一个事务只能看到在它开始之前已经提交的其他事务所做的更改。

  5. 垃圾回收
    PostgreSQL 使用 VACUUM​ 命令来清理不再需要的数据版本,释放空间。VACUUM​ 操作由系统自动调度,也可以手动执行。

MVCC 的关键特点:
  • 无锁读取
    MVCC 允许其他事务在读取数据时不被锁定,因为它们可以访问数据的旧版本。
  • 写入时复制
    当数据被更新时,PostgreSQL 会复制旧版本的数据并创建新版本,而不是直接在原地修改。
  • 隔离级别
    PostgreSQL 支持不同的事务隔离级别,如读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。隔离级别决定了事务可以看到其他事务更改的时间点。
  • 性能
    MVCC 可以提高数据库的性能,因为它减少了锁的争用和事务间的阻塞。
  • 一致性
    通过使用快照,MVCC 确保了事务在整个过程中看到的是一致性的数据视图。
MVCC 的挑战:
  • 表膨胀
    由于多版本的存在,表可能会膨胀,需要定期维护。
  • 长事务
    长事务可能导致较旧的数据版本长时间不被回收,从而影响性能和空间。
  • 系统资源
    MVCC 需要额外的系统资源来管理多个数据版本。

MVCC 是 PostgreSQL 强大并发控制机制的核心,它使得数据库能够高效地处理大量的并发事务,同时保持数据的一致性和隔离性。

表膨胀

多版本并发控制机制(MVCC)的原理在于,当它需要更改某块数据的时候,它不会直接去更改,而是会创建这份数据的新版本,在新版本进行更改,所以会存储多份版本,每个事务能看见哪一份版本的数据,由事务隔离级别控制。

MVCC引入了一个问题,如何消除老旧的、没有使用的无用数据(版本),目前主流上有3种处理实现方式:

来看看各种数据库的解决方式:

  1. 以Oracle为代表的,把旧版本数据放入UNDO,新数据放入REDO,然后更改数据。这种方式,旧版本的数据放入了UNDO,所以可以有效避免膨胀。

  2. 以SQL Server为代表的,把旧版本的数据写入专门的临时表空间,新数据写入日志,然后去更改数据。这种方式,旧版本的数据放入了专门的临时表空间,所以也可以有效地避免膨胀。

  3. 以PostgreSQL为代表的,把旧版本标示为无效,新数据写入日志,成功后把新版本的数据写入新的位置。这种实现机制是导致数据膨胀严重的一个重要原因,因为旧版本的数据虽然表示为无效状态,但是没被回收前还是占据存储空间。

Vacuum 工作原理

PostgreSQL的表膨胀清理就需要依赖vacuum,vacuum的主要任务就是清理表和索引中不需要的数据(dead tuples),为新加入的数据清理出来空间。

Vacuum

PostgreSQL中的VACUUM​命令是一种数据库维护任务,用于清理数据库中的无用空间(也称为“dead tuples”或“ghost tuples”),并防止表膨胀。VACUUM​还更新数据库的统计信息,这些信息由查询优化器用来选择最有效的查询计划。以下是VACUUM​如何工作的详细步骤:

  1. 标记删除
    PostgreSQL使用一种称为标记-清除(mark-sweep)的垃圾收集机制。当DELETE或UPDATE命令删除或修改表中的数据行时,原始数据行不会被立即从存储中移除,而是被标记为“已删除”。这意味着这些行仍然占用空间,但对查询来说是不可见的。
  2. 移除元组
    这里的移除dead tuples只是标记为可重用该空间,并没有真正物理删除。所以vacuum清理表后,表的实际空间并没有减小。dead tuples在做移除标记后,vacuum会重新排列剩余的元组以进行碎片化整理。然后,需要更新目标表的VM(可见性映射文件)和FSM(空闲空间映射文件)。
  3. 更新统计信息
    VACUUM​收集有关表和索引中数据分布的统计信息,并将这些信息存储在系统目录中。这些统计信息对于查询优化器来说是至关重要的,因为它们帮助优化器决定如何执行查询。

VACUUM ​在这段时间删除的数据,并不会从此磁盘上删除,只是将数据标为可删除,这部分可删除的空间会出现以下两种情况:

  • 当有新的数据进行,新数据会写入至这部分可删除的空间中,即老数据从磁盘上移除了
  • 系统执行 vacuum full​ ,PgSql 会重新整理所有的元组(Tuples),最终将数据从磁盘上移除,这一步比较耗费资源和时间,有可能锁表,生产环境慎用!

Vacuum Full

Vacuum Full和Vacuum最大的不同就是,Vacuum Full是物理删除dead tuples,并把释放的空间重新交给操作系统,所以在vacuum full后,表的大小会减小为实际的空间大小。其处理过程和 vacuum 大不相同,处理步骤如下:

  1. 创建排它锁

    vacuum full 开始执行时,系统会先对目标创建一个AccessExclusiveLock ,不允许外界再进行访问(为后面拷贝做准备)。

  2. 创建新表

    系统会创建一张表结构和源表一模一样的新表,方便后续做数据操作。

  3. 复制数据

    扫描目标表,把表中的live tuples 拷贝到新表中。

  4. 替换数据表

    删除目标表,在新表上,重新创建索引,更新VM, FSM以及统计信息,相关系统表等。

综上所述,vacuum full的本质是生成一个新的数据文件,然后把原有表的live tuples存放到该数据文件中。对比vacuum, vacuum full缺点就是在执行期间不能对表进行访问,由于需要往新表中导入live tuples数据,其执行效率也会很慢。优点是执行后,表空间只存放live tuples,没有冗余的dead tuples,在执行查询效率上会有所提高。

但是,vacuum full 也有存在的问题,在执行过程中,它会block所有对表的访问,不只是写操作,读操作也会全部block。很多情况下这是不可接受的,尤其是生产环境。

Vacuum 的好处

PostgreSQL中的VACUUM​命令具有多个好处,主要包括:

  1. 回收空间VACUUM​可以清理数据库中的无用空间,即那些被标记为“已删除”的行占用的空间,从而释放这些空间供其他数据使用。
  2. 更新统计信息VACUUM​会更新数据库的统计信息,这些信息对于查询优化器选择最有效的查询计划至关重要。
  3. 维护索引VACUUM​还会维护索引,删除索引中指向已删除数据行的条目,并可能重建索引以优化性能。
  4. 防止表膨胀:随着时间推移,表中的死元组会越来越多,这会导致存储空间利用率下降,VACUUM​可以防止这种情况。
  5. 提高查询性能:通过清理无用的元组,VACUUM​可以减少查询需要遍历的数据量,从而提高查询性能。
  6. 自动回收空间VACUUM​可以自动回收已经释放的空闲空间,减少了数据库管理员的手动干预。

VACUUM​是PostgreSQL数据库维护和性能优化的重要组成部分,正确理解和运用VACUUM​命令及其变种,对于保持数据库的良好运行状态具有重要意义。

Vacuum 的最佳实践

PostgreSQL中的VACUUM​操作是数据库维护的重要组成部分,以下是一些最佳实践:

  1. 定期执行VACUUM:根据业务负载和表的更新频率,制定合理的VACUUM策略,特别是对于频繁更新的大表。
  2. 启用并调优Autovacuum:依赖Autovacuum来自动维护数据库健康。通过调整autovacuum_vacuum_threshold​和autovacuum_vacuum_scale_factor​等参数,可以更精确地控制自动VACUUM的触发时机。
  3. 考虑使用VACUUM FULL:虽然VACUUM FULL​可以最大程度地释放磁盘空间,但由于它可能会锁定表并需要较长时间执行,建议在业务低峰期使用,并确保有足够的磁盘空间来创建表的新副本。
  4. 监控Vacuum活动:利用pg_stat_user_tables​视图或其他监控工具,了解Vacuum操作的状态和效果,以便及时调整相关参数。
  5. 不要无故运行手动VACUUM或ANALYZE:Autovacuum通常可以很好地管理数据库,除非有特殊情况,否则不必频繁手动执行这些操作。
  6. 在数据批量加载后运行ANALYZE:在大量新数据被插入数据库后,运行ANALYZE以确保统计信息的准确性,从而帮助查询优化器制定更有效的查询计划。
  7. 收集数据库信息:在调整参数或实施手动VACUUM/ANALYZE之前,收集有关数据库的足够信息,如表的行数、死元组数、最后一次VACUUM/ANALYZE的时间等,以便做出更明智的决策。

通过遵循这些最佳实践,可以确保数据库的性能和健康状况得到良好的维护。


参考文档:

Kimi.ai - 帮你看更大的世界

PostgreSQL的表膨胀与Vacuum和Vacuum Full - 明矾 - 博客园

深入浅出 PostgreSQL VACUUM 流程,全面掌控数据健康与性能! - ByteZoneX社区

blog/202405/20240530_01.md at master · digoal/blog · GitHub

这篇关于VACUUM 剖析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1075821

相关文章

深度剖析AI情感陪伴类产品及典型应用 Character.ai

前段时间AI圈内C.AI的受够风波可谓是让大家都丈二摸不着头脑,连C.AI这种行业top应用都要找谋生方法了!投资人摸不着头脑,用户们更摸不着头脑。在这之前断断续续玩了一下这款产品,这次也是乘着这个风波,除了了解一下为什么这么厉害的创始人 Noam Shazeer 也要另寻他路,以及产品本身的发展阶段和情况! 什么是Character.ai? Character.ai官网:https://

最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)

文章目录 一、自动配置概念二、半自动配置(误~🙏🙏)三、源码分析1、验证DispatcherServlet的自动配置2、源码分析入口@SpringBootApplication3、@SpringBootConfiguration的@Configuration4、@EnableAutoConfiguration的@AutoConfigurationPackage和@Import5、Auto

C语言深度剖析--不定期更新的第四弹

哈哈哈哈哈哈,今天一天两更! void关键字 void关键字不能用来定义变量,原因是void本身就被编译器解释为空类型,编译器强制地不允许定义变量 定义变量的本质是:开辟空间 而void 作为空类型,理论上不应该开辟空间(针对编译器而言),即使开辟了空间,也只是作为一个占位符看待(针对Linux来说) 所以,既然无法开辟空间,也无法作为正常变量使用,既然无法使用,干脆编译器不让它编译变

Java CAS 原理剖析

在Java并发中,我们最初接触的应该就是synchronized关键字了,但是synchronized属于重量级锁,很多时候会引起性能问题,volatile也是个不错的选择,但是volatile不能保证原子性,只能在某些场合下使用。   像synchronized这种独占锁属于悲观锁,它是在假设一定会发生冲突的,那么加锁恰好有用,除此之外,还有乐观锁,乐观锁的含义就是假设没有发生冲突,那么我正

STL源码剖析之【二分查找】

ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)算法返回一个非递减序列[first, last)中的第一个大于等于值val的位置。      ForwardIter upper_bound(ForwardIter first, ForwardIter last, const _Tp& val

深入剖析 Redis 基础及其在 Java 应用中的实战演练

引言 在现代分布式系统和高并发应用中,缓存系统是不可或缺的一环,而 Redis 作为一种高性能的内存数据存储以其丰富的数据结构和快速的读写性能,成为了众多开发者的首选。本篇博客将详细介绍 Redis 的基础知识,并通过 Java 代码演示其在实际项目中的应用。 目录 什么是 Redis?Redis 数据结构详解Redis 与其他 NoSQL 数据库的对比在 Java 中使用 Redis 使用

我店平台商业模式深度剖析

“我店”平台采用了融合线上与线下资源,并以绿色积分为激励机制的创新商业模式。此模式旨在打造一个集购物、消费及积分兑换为一体的综合性服务平台。编辑v:qawsed2466。以下是对其商业模式的深入剖析: 平台定位与背景 “我店”由上海我店科技网络有限公司创立于2021年8月,作为一个本地生活服务平台,它致力于响应国家的环保政策,并运用绿色积分来促进经济活动,帮助实体店铺吸引客流。面对实体商业

剖析Cookie的工作原理及其安全风险

Cookie的工作原理主要涉及到HTTP协议中的状态管理。HTTP协议本身是无状态的,这意味着每次请求都是独立的,服务器不会保留之前的请求信息。为了在无状态的HTTP协议上实现有状态的会话,引入了Cookie机制。 1. Cookie定义 Cookie,也称为HTTP cookie、web cookie、互联网cookie或浏览器cookie,是一种用于在用户浏览网站时识别用户并为其准备

Yarn 源码 | 分布式资源调度引擎 Yarn 内核源码剖析

曾有人调侃:HBase 没有资源什么事情也做不了,Spark 占用了资源却没有事情可做?   那 YARN了解一下? 01 YARN! 伴随着Hadoop生态的发展,不断涌现了多种多样的技术组件 Hive、HBase、Spark……它们在丰富了大数据生态体系的同时,也引发了新的问题思考。   熟悉大数据底层平台的朋友,应该都了解这些为大数据场景设计的技术组件不仅个个都是消耗资源的大户,而且它们本

HDFS要点剖析

谈到大数据,不得不提的一个名词是“HDFS”。它是一种分布式文件存储系统,其系统架构图如下图所示: 从图中可以了解到的几个关键概念 元数据(MetaData)机架(Rock)块(Block) 从图中可以了解到的两个重要组件: NameNodeDataNode 需要了解的另一个组件: SecondaryNameNode 三个重要的组件说明 NameNode 简单地说,NameNod