转载自 https://www.modb.pro/db/63663

dead tuples
tuple:元组,也就是一行数据

首先,简要解释什么是"死元组"和"膨胀".

当您在PostgreSQL中执行DELETE时,行不会立即从数据文件中删除.而是仅通过在页头中设置xmax字段将其标记为已删除.同样对于UPDATE,它可能在PostgreSQL中被视为DELETE+INSERT.

这是PostgreSQL MVCC背后的基本思想之一,因为它允许更大并发,在不同的进程之间最小的锁定.这个MVCC实现的缺点是留下了已删除的元组,即使在所有可能看到这些版本的事务完成之后也是如此.

如果没有清理,那些"死元组"(对于任何事务实际上是不可见的)将永远留在数据文件中.对于DELETE和UPDATE比较多的的表,死元组可能占据很多磁盘空间.同时,死元组也将从索引中引用,进一步增加了浪费的磁盘空间量.这就是我们在PostgreSQL中称之为“膨胀”的东西,同时因为查询也会变慢。

下面主要介绍vacuum清理dead tuples的过程。 在清理dead tuples时,系统有两种处理方式:vacuum 和 vacuum full。主要区别在如下:

vacuum
只是把表中的dead tuples进行删除标记,并没有真正物理删除;vacuum过程中,可以正常访问数据表
vacuum full
物理删除表中的dead tuples,释放空间给操作系统;vacuum full过程中,表被锁定,不允许访问

Vacuum 做了什么
1 扫描所有表,或者特殊表,得到dead tuples

2 如果需要会固化需要清理的dead tuples

3 清理与dead tuples有关的index tuple

4 清理页面中的dead tuples 并将清理后的空间释放

5 更新对应表的FSM 和 VM 文件

6 更新相关的系统表

Vacuum FULL 做了什么

1 对于表使用了独占锁 exclusive lock

2 创建一个并行的空的存储文件

3 将目前的标记为存活的tuples(行)拷贝到了新的存储中(其实就是新的物理文件)

4 在将原有的数据都拷贝后,开始释放原有的存储数据的文件

5 释放独占锁

Postgresql vacuum 和 vacuum full相关推荐

  1. PostgreSQL中的VACUUM

    最近搞了一个公众号PostgreSQL运维技术,欢迎来踩~ 悄悄放一张: PostgreSQL运维技术 我在之前的一篇介绍MVCC的文章中提到,MVCC有事务ID回卷的问题,它的解决方案是VACUUM ...

  2. Vacuum和Vacuum Full的处理过程

    对于数据库系统的并发控制,PostgreSQL采用MVCC(多版本并发控制)进行处理.这种机制有一个缺点,就是随着时间的推移,数据文件中积累的dead tuples会越来越多.怎么去清理这些dead ...

  3. Postgresql垃圾回收Vacuum优化手册

    1 Vacuum启动频率太低 参数 建议 autovacuum_vacuum_scale_factor 当update,delete的tuples数量超过 autovacuum_vacuum_scal ...

  4. postgresql源码学习(53)—— vacuum②-lazy vacuum之heap_vacuum_rel函数

    一. table_relation_vacuum函数 1. 函数定义 前篇最后(https://blog.csdn.net/Hehuyi_In/article/details/128749517),我 ...

  5. Postgresql之Vacuum和Vacuum full的区别

    参考文章:Postgresql关于Vacuum的作用和操作方法,Vacuum full锁表并生成新的relfilenode_ITPUB博客 简单说明 在PostgreSQL中,一次行的UPDATE或D ...

  6. PostgreSQL 怎么通过vacuum 加速事务ID回收的速度 (翻译)

    此文为翻译文字原文连接在文字最下方 经历上次transaction id 回收报警的问题后,除了上次总结后,发现对于transaction id 的回收的问题还是处于一个急需在学习的过程,所以有了下面 ...

  7. mysql vacuum_PostgreSQL vacuum原理—vacuum揭秘

    在前面两个章节中,我们讲了vacuum的一些重要参数"PostgreSQL vacuum原理一功能与参数"以及PG发起vacuum的流程"PostgreSQL vacuu ...

  8. vacuum和vacuum full区别

    1:vacuum full会lock table ,vacuum不会. 2:vacuum只是将deadtuple的行的空间转换为能够使用的状态,vacuum full会将这些空间碎片后面的数据上移. ...

  9. PostgreSQL 并行vacuum patch - 暨为什么需要并行vacuum或分区表

    标签 PostgreSQL , vacuum , freeze , 分区表 , 并行vacuum 背景 我们之前做过一个这样的测试,单表数据从1000万到10亿,对其进行增删改查的压测,性能几乎没有衰 ...

最新文章

  1. PubChem的Python接口PubChemPy
  2. 使用自定义UISlider控制View亮度
  3. 456. 132 Pattern | 456. 132 模式(单调栈)
  4. Spring Cloud构建微服务架构:分布式配置中心【Dalston版】
  5. Git仓库迁移,包括所有的分支、标签、日志
  6. python3生成二维码实例fromm_Python使用mqtt极简例子
  7. 你知道他们的输出结果吗?
  8. SQL查询提速秘诀,避免锁死数据库的数据库代码
  9. java 改为matlab_用面向对象的方法将一段JAVA代码转化为matlab
  10. Qt4_在Qt设计师中集成自定义窗口部件
  11. python 类 探索
  12. 4.程序员的自我修养---静态链接
  13. windows XP小技巧
  14. c语言数组指针定义方法,C语言数组指针定义方法
  15. 大气生活用品电商网站模板
  16. C++ —— 句柄类的实现方式 —— 类实现的隐藏
  17. 手写一个识别旺旺/千牛,手机在线/电脑在线状态的小工具
  18. 数据库之系统的三级模式结构
  19. PHP实现文件下载功能,提示压缩包损坏及打不开的解决方法
  20. 使用 OneDrive 对电脑内的任意文件进行备份

热门文章

  1. php-2612硒鼓加墨_HP2612A硒鼓加粉图解
  2. html中如何引用其外部字体,css引入外部字体
  3. 排查线上问题的9种方式
  4. 光流文件(.flo)转成图片(.png)
  5. [HSCSEC 2023] rev,pwn,crypto,Ancient-MISC部分
  6. e签宝认证服务API PHP请求签名鉴权生成
  7. 为何优秀的程序员不断离开?,中高级Java面试中你不得不会的知识点
  8. 用python打印购物小票和证书
  9. 点心、MIUI、乐众OS架构师讲Android底层故事
  10. 工行银企互联(NC模式)中间件开发模式