PostgreSQL清理dead tuples(vacuum和vacuum full)

news2024/11/22 5:09:19

前言

PostgreSQL的并发控制,采用MVCC(多版本并发控制)进行处理。这种机制有一个缺点:随着时间的推移,数据文件中积累的dead tuples(死数据/死元组)会越来越多。

在清理dead tuples时,系统有两种处理方式:vacuum 和 vacuum full。

简单使用

vacuum 表名;
vacuum full 表名;

vacuum和vacuum full区别

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

  • vacuum:只是把表中的dead tuples进行删除标记,并没有真正物理删除;将dead tuple的行的空间转换为能够使用的状态,vacuum过程中,可以正常访问数据表,不锁表。
  • vacuum full:物理删除表中的dead tuples,释放空间给操作系统;vacuum full过程中,表被锁定,不允许访问。
    在这里插入图片描述

原理

Vacuum过程

  1. 清除dead tuples指向的index tuples

vacuum会顺序扫描目标表,并构建一个dead tuples组成的list链表,该list链表会存储在maintenance_work_mem缓存中。然后vacuum根据dead tuples list移除dead tuples指向的index索引。

  1. 移除dead tuples,更新VM(可见性映射文件)和FSM(空闲空间映射文件)

这里的移除dead tuples只是标记为可重用该空间,并没有真正物理删除。所以vacuum清理表后,表的实际空间并没有减小。dead tuples在做移除标记后,vacuum会重新排列剩余的元组以进行碎片化整理。然后,需要更新目标表的VM(可见性映射文件)和FSM(空闲空间映射文件)。

  1. 更新统计信息和相关系统表

更新vacuum目标表的统计信息(以适应最新的查询优化)和相关系统表。

AutoVacuum守护进程
  • 由于vacuum是数据库系统的一个例行性维护,所以系统启动后,会开启一个AutoVacuum守护进程专门对此处理
  • AutoVacuum清理进程一般用vacuum而避免使用vacuum full。
    理由:vacuum尽管可以保持表的最小尺寸,但是如果表还有继续增长的空间,这么做就意义不大了,特别是对于频繁写入的表。而且vacuum在执行效率上也比vacuum full好。
  • AutoVacuum进程是一个launcher进程,它不进行vacuum操作,它负责启动vacuum worker进程,然后由vacuum worker进程进行相应的vacuum和analyze操作
    在这里插入图片描述

AutoVacuum进程会在每autovacuum_naptime时间间隔内为数据库启动autovacuum worker进程。然后每个worker进程会检查数据库中的每一个表,在需要时执行vacuum或analyze操作。如果有N个数据库,则每 autovacuum_naptime/N秒将启动一个新worker进程,在同一时间只允许最多autovacuum_max_workers 个worker进程运行,如果有超过autovacuum_max_workers 个数据库需要被处理,下一个数据库将在第一个worker结束后马上被处理。

Vacuum Full过程

  1. vacuum full开始执行时,系统会先对目标创建一个AccessExclusiveLock(访问独占锁/读排它锁),不允许外界再进行访问(为后面拷贝做准备),然后创建一个表结构和目标表相同的新表。
  2. 扫描目标表,把表中的live tuples(活数据/活元组)拷贝到新表中。
  3. 删除目标表,在新表上,重新创建索引,更新VM(可见性映射文件), FSM(空闲空间映射文件)以及统计信息,相关系统表等。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

redis第五第六章-redis并发缓存架构和性能优化

一、缓存设计 1.缓存穿透 缓存穿透是指查询一个根本不存在的数据, 缓存层和存储层都不会命中, 通常出于容错的考虑, 如果从存储层查不到数据则不写入缓存层。 缓存穿透将导致不存在的数据每次请求都要到存储层去查询, 失去了缓存…

高通 Camera HAL3:添加一个Feature

一.概述 以HDR Feature为例,在CamX中添加一个新的Feature 从上游stream(upstream) feature获取格式P010的多帧数据作为inputpipeline(SWMFMergeYuv)运行算法生成同样格式的单帧数据作为输出,发送给下游stream(down stream) feature 二.添加 2.1 从Feat…

自动计算图片的宽度和高度拉伸至全屏附CSS及VUE简单实现

1、简介 场景:比如说APP封面等特点:能够自动适应设备的宽高,保证图片100%显示,不会缺失或者留边,但有可能会变形。 2、实现 注意以下代码尽管是在Vue环境下实现的,但与Vue关系不大,代码本身也足…

【Python】列表 List ④ ( 插入操作 / 追加操作 | 列表插入操作 List#insert | 列表追加元素操作 List#append )

文章目录 一、列表插入操作1、List#insert 函数简介2、代码示例 - 列表插入元素 二、列表追加元素操作1、List#append 函数简介2、代码示例 - 列表追加元素 一、列表插入操作 1、List#insert 函数简介 Python 列表 通过调用 List#insert 函数 插入元素 , 该函数需要传入两个参数…

chatgpt赋能python:Python商场打折问题详解

Python商场打折问题详解 在商场营销策略中,打折是一种常见的手段。而Python作为一种广泛应用于数据科学和机器学习的编程语言,也可以用来解决商场打折问题。本文将介绍Python实现商场打折的方法和步骤,希望能对广大商场营销人员和数据科学家…

C语言——数据在内存中的存储(未完待续)

文章目录 一、数据类型的介绍1.0、有符号跟无符号计算原理在这里插入图片描述1.1、数据类型的基本分类 二、整形与浮点型在内存中的存储1.整型1.0、大小端的介绍 2.原码、反码、补码2.0、原码2.1、反码2.2、补码2.3、补码转原码第二种方法 三 、浮点型3.0、浮点数存储的例题&am…

20230604给coolpi4b开发板刷机的LOG

20230604给coolpi4b开发板刷机的LOG 2023/6/4 23:49 IMG I:\BaiduNetdiskDownload\20230317[在线刷机]-RKDevTool专用镜像 I:\BaiduNetdiskDownload\20230317[在线刷机]-RKDevTool专用镜像\Windows驱动程序\DriverAssitant_v5.12.zip I:\BaiduNetdiskDownload\20230317[在线…

WGCNA | 不止一个组的WGCNA怎么分析嘞!?~(三)(共识网络分析-第三步-共识模块与特异模块相关联)

1写在前面 有小伙伴子留言问最近介绍的WGCNA共识网络的意义是什么,保守性吗!?🧐 与把雄性小鼠和雌性小鼠的数据merge在一起,一起构建网络、确定模块的方式有什么区别呢!?😗 其实区别…

JavaSE进阶(day13,复习自用)

单元测试、反射、注解、动态代理 单元测试单元测试概述单元测试快速入门单元测试常用注解 反射反射概述反射获取类对象反射获取构造器对象反射获取成员变量对象反射获取方法对象反射的作用-绕过编译阶段为集合添加数据反射的作用-通用框架的底层原理 注解注解概述自定义注解元注…

数据在内存中存储的现象

🤩本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 🥰内容专栏:这里是《C知识系统分享》专栏,笔者用重金(时间和精力)打造,基础知识一网打尽&#xff0c…

chatgpt赋能python:Python图片合成:背景设计的新方案

Python 图片合成:背景设计的新方案 简介 图像合成是一项艺术性和创新性的工作,它涉及到多个过程,包括图像处理、透明度和滤镜应用。Python 我们可以使用其各种库快速、可靠地进行图像合成。在这篇文章中,我们将介绍如何使用 Pyt…

chatgpt赋能python:Python在线模拟器:让编程变得更加轻松

Python 在线模拟器:让编程变得更加轻松 介绍 Python 在线模拟器是一个非常实用的工具,它可以帮助用户直接在浏览器中测试和运行 Python 代码。在线模拟器的出现简化了编程过程,不需要安装 Python IDE 等软件,只需要有一台连接互…

LSM零知识学习三、插桩原理实现细节(1)

本文内容参考: LSM(Linux Security Modules)框架原理解析_lsm框架_pwl999的博客-CSDN博客 Linux LSM(Linux Security Modules) Hook Technology_weixin_30929011的博客-CSDN博客 特此致谢! 一、插桩具体实现 前文介绍了插桩原理,本文来详…

chatgpt赋能python:Python图片大小怎么算?

Python图片大小怎么算? 在Web开发中,经常需要展示图片,但是为了让网页加载速度更快,我们需要对图片进行压缩和优化,其中一个重要的参数就是图片的大小。那么在Python中,如何计算图片大小呢? 图…

包扫描工具实现(详解)

文章目录 前言包扫描实现思路(需求分析): 具体实现完整代码 前言 注解在 Java 是一个非常重要的存在,而且它出现的非常频繁。 在一个工程下可能有许多的包或者Jar包,为了结合注解可以准确的定位到一个需要的类上&…

代码随想录算法训练营第四十六天|139.单词拆分

LeetCode139.单词拆分 动态规划五部曲: 1,确定dp数组以及下标的含义: dp[i] : 字符串长度为i的话,dp[i]为true,表示可以拆分为一个或多个在字典中出现的单词。 2,确定递推公式: 如果确定dp[j…

javascript基础二十:说说你对DOM的理解,常见的操作有哪些?

一、DOM 文档对象模型 (DOM) 是 HTML 和 XML 文档的编程接口 它提供了对文档的结构化的表述,并定义了一种方式可以使从程序中对该结构进行访问,从而改变文档的结构,样式和内容 任何 HTML或XML文档都可以用 DOM表示为一个由节点构成的层级结构…

交通物流模型 | Python建模实现动态交通分配优化问题求解

文章目录 效果一览文章概述研究内容程序设计参考资料效果一览 文章概述 交通物流模型 | Pyomo建模框架实现动态交通分配优化问题求解,DTA 交通分配问题通常需要考虑许多因素,例如道路容量、交通需求、速度限制、车辆类型、交通信号灯等,在城市规划和交通管理领域中具有重要的…

分布式系统概念和设计——分布式事务

分布式系统概念和设计 分布式事务 访问多个服务器管理的对象的事务称为分布式事务。 当一个分布式事务结束时,事务的原子特性要求所有参与事务的服务器必须全部提交或全部放弃。 实现: 其中一个服务器承担了协调者的角色,保证在所有的服务器…

chatgpt赋能python:Python图片取模:提高网页加载速度与用户体验

Python图片取模:提高网页加载速度与用户体验 随着互联网的发展与全球化进程的加速,网站的速度与易用性成为用户选择网站的重要因素。在这种情况下,我们需要优化网站的加载速度与用户体验。其中一种优化方法就是使用图片取模。 本文将向您介…