试着总结一下:pg的vacuum机制

1. 什么是vacuum

1.1. 什么是vacuum

在 PostgreSQL 数据库中,VACUUM 是一种用于管理和维护表的操作。它主要用于两个目的:

1.1.1. 释放未使用的空间

当在表中进行删除、更新或移动行时,PostgreSQL 并不会立即释放磁盘上占用的空间。相反,被标记为“删除”或“更新”的行会留在磁盘上,占据着空间。这会导致表文件增大,但实际上并没有增加有效的数据量。VACUUM 的作用是清理这些已被标记为删除的行,释放出这些未使用的空间。

1.1.2. 维护数据库的可见性与性能

PostgreSQL 使用多版本并发控制(MVCC)来处理事务。这意味着旧的行版本可能仍然对数据库的一致性是可见的。VACUUM 会清理已删除的行版本,确保数据库中只包含有效的数据,并且更新统计信息以供查询优化器使用。这有助于保持查询性能并防止数据混淆。

  1. 类型

在 PostgreSQL 中,有几种类型的 VACUUM:

  • VACUUM: 用于释放未使用空间,并更新表的统计信息。
  • VACUUM FULL: 执行更彻底的清理,会重写整个表并释放未使用的空间。但是 VACUUM FULL 会锁定整个表,可能会影响数据库的可用性,因此需谨慎使用。
  • ANALYZE: 单独执行统计信息更新,而不进行空间释放。这可以单独执行而无需执行 VACUUM。
  1. 自动执行

PostgreSQL 提供了自动执行 VACUUM 的功能,称为 autovacuum。这是一个后台进程,根据系统中的活动和表的更新情况自动触发 VACUUM 操作。这有助于保持数据库性能,并防止未使用空间堆积过多。

  1. 重要性

VACUUM 是 PostgreSQL 中维护数据库健康和性能的关键操作。定期执行 VACUUM 可以避免表文件膨胀、提高查询性能,并确保数据库的一致性和可靠性。

1.2. 其他主流数据库如何解决

不同的主流关系型数据库在处理类似于 PostgreSQL 中的 VACUUM 操作时可能有着不同的实现方式和名称。以下是一些主流关系型数据库处理类似问题的方式:

1.2.1. MySQL / MariaDB

MySQL 和 MariaDB 是两个流行的关系型数据库,它们在管理未使用空间和维护表性能方面有一些不同的机制:

  • OPTIMIZE TABLE: 在 MySQL 和 MariaDB 中,使用 OPTIMIZE TABLE 命令可以整理表并释放未使用的空间,类似于 PostgreSQL 的 VACUUM FULL
  • InnoDB 的自动空间管理: 对于 InnoDB 存储引擎,它会自动重用未使用的空间,但可能不会立即释放给操作系统。

1.2.2. Microsoft SQL Server

Microsoft SQL Server 在处理未使用空间和维护表的过程中使用了不同的方式:

  • AUTO_SHRINK: SQL Server 中可以配置数据库以自动收缩文件并释放未使用的空间。
  • DBCC SHRINKFILE: 使用 DBCC SHRINKFILE 命令可以手动收缩数据文件,从而释放未使用的空间。

1.2.3. Oracle Database

Oracle 数据库也有其独特的方法来处理类似的问题:

  • 表空间管理: Oracle 使用表空间来管理数据文件,可以通过对表空间进行压缩来释放未使用的空间。
  • Segments 和 Extents: Oracle 使用 Segments 和 Extents 来存储数据,它们的管理和维护有助于维护表的性能。

1.2.4. SQLite

SQLite 是一种轻量级的嵌入式数据库,通常用于移动设备或小型应用。它在表维护方面有着独特的机制:

  • VACUUM: 类似于 PostgreSQL,SQLite 也有 VACUUM 命令,用于释放未使用的空间并优化数据库文件。

尽管这些数据库在处理未使用空间和表维护方面有不同的机制和命令,但它们的目标都是类似的:维护数据库性能,释放未使用的空间以提高存储效率,并且确保查询时只返回有效的数据。

2. 在什么情况下会触发vacuum

在 PostgreSQL 中,VACUUM 机制会在以下情况下被触发:

2. 1. 手动触发

  • 手动执行 VACUUM: 使用 VACUUMVACUUM FULLVACUUM ANALYZE 命令手动触发 VACUUM 操作。
  • 手动执行 ANALYZE: 使用 ANALYZE 命令手动触发更新统计信息的操作。

2.2. 自动触发(autovacuum)

PostgreSQL 提供了自动执行 VACUUM 的功能,称为 autovacuum。它是一个后台进程,根据系统中的活动和表的更新情况自动触发 VACUUM 操作。

2.3. 触发条件

VACUUM 会在以下情况下被触发:

  • 行版本存储超过限制: 当表的行版本存储超过了限制,例如在 pg_class 中记录的限制值时,会触发 VACUUM。
  • 被删除或更新的行数量达到阈值: 当表中被删除或更新的行数量达到一定阈值时,会触发 autovacuum。
  • 数据库中的活动度和更新频率: autovacuum 会根据数据库中的活动度和表的更新频率动态地触发 VACUUM 操作,以维护表的性能和空间。

2.4. 重要性

定期执行 VACUUM 对于数据库性能和空间的管理非常重要。它有助于释放未使用的空间、更新统计信息并维护 MVCC 所需的元数据,以确保查询性能、维护数据一致性,并减少数据库空间的浪费。因此,手动或自动触发 VACUUM 是 PostgreSQL 数据库维护的关键步骤之一。

3. vacuum和开发语言的类比

可以将 PostgreSQL 中的 VACUUM 机制类比于 Java 中的 JVM(Java 虚拟机)和 C# 中的 GC(垃圾回收器)机制。

3.1. VACUUM 与 JVM / GC 的类比

  1. VACUUM 和 GC 的作用类似

    • VACUUM 负责清理 PostgreSQL 表中未使用的空间,释放废弃的数据,并维护表的性能。这与 JVM 中的 GC 机制类似,后者负责回收不再使用的内存,以确保内存的高效使用。
  2. 定期清理和自动化执行

    • 像 VACUUM 一样,GC 也会定期运行,以检查和清理不再使用的对象或内存。它们都可以手动触发,也可以自动执行。
  3. 维护性能和资源管理

    • VACUUM 和 GC 都是为了维护性能和资源管理而设计的。VACUUM 有助于维护数据库性能,确保查询性能并释放未使用空间,而 GC 有助于维护程序的内存使用情况,确保避免内存泄漏并提高程序的性能。
  4. 自动化优化

    • PostgreSQL 的 autovacuum 类似于 JVM 中的自动化 GC。它们都是后台进程,根据特定规则和条件动态地触发清理和回收操作。

尽管 VACUUM、GC 和数据库的内存管理有着不同的上下文和具体实现方式,但它们的目标相似,即保持系统性能和资源的有效利用。它们都是为了管理资源并避免资源的浪费而设计的关键组件。

4. 如何查看和复现vacuum

4.1. 查看vacuum

在 PostgreSQL 中,你可以使用以下方法来查看是否有 VACUUM 进程在运行或者最近运行的信息:

4.1.1. 查询系统视图

使用以下系统视图来查看自动化 VACUUM 的执行情况:

  • pg_stat_all_tables: 提供了有关所有表的统计信息,包括最后一次 VACUUM 的时间。
  • pg_stat_progress_vacuum: 提供了 VACUUM 进程的详细进度信息。

通过查询这些视图,可以获得 VACUUM 的执行情况和进度。

4.1.1.1 pg_stat_progress_vacuum

pg_stat_progress_vacuum 是 PostgreSQL 中一个系统视图,用于提供关于正在进行的 VACUUM 操作的详细进度信息。它可以让你监视当前正在执行的 VACUUM 进程,并了解该进程的状态和进度。

字段名描述
pidVACUUM 进程的进程 ID
datid正在执行 VACUUM 的数据库 ID
relid正在处理的表的 OID
phaseVACUUM 的阶段(扫描、清理等)
heap_blks_total表中需要扫描的块总数
heap_blks_scanned已扫描的表块数
heap_blks_vacuumed已清理的表块数
index_vacuum_count已经清理的索引数
max_dead_tuples目前已找到的任何一页中的最大死元组数量
num_dead_tuples已处理的死元组总数
last_vacuum_time最后一次 VACUUM 进程更新的时间
注意事项:
  • 这个视图提供了对 VACUUM 进程的实时监控,允许你了解 VACUUM 正在执行的表、处理进度和已经完成的工作量。
  • 通过监视 pg_stat_progress_vacuum 视图,可以查看 VACUUM 的实时状态,以便跟踪和优化表的清理过程,并了解清理进度是否符合预期。

这个视图是一个有用的工具,可以让你深入了解正在进行的 VACUUM 操作的进度和状态,从而更好地监控和管理 PostgreSQL 数据库的维护工作。

4.2. 复现vacuum

在一个空库中复现 VACUUM 机制发生并不容易,因为 VACUUM 主要用于处理已删除或更新的行,清理未使用的空间以及维护表的性能。在空库中,没有数据删除或更新的情况,所以不会触发 VACUUM。

然而,你可以通过模拟具有删除、更新或插入数据的情况来触发 VACUUM 机制。以下是一些方法:

4.2.1. 插入大量数据然后删除

CREATE TABLE test_table (id SERIAL PRIMARY KEY,name VARCHAR
);-- 插入大量数据
INSERT INTO test_table (name) SELECT 'Name' || generate_series(1, 1000000);-- 删除数据
DELETE FROM test_table WHERE id % 2 = 0;

在上面的例子中,我们创建了一个表并向其插入大量数据,然后使用 DELETE 语句删除部分数据。删除操作会留下已被标记为"删除"的行,而执行 VACUUM 后会清理这些已标记为删除的行。

4.2.2. 执行 UPDATE 操作

-- 更新数据
UPDATE test_table SET name = 'NewName' WHERE id % 3 = 0;

类似地,更新操作也会标记旧的行为"更新",这些更新过的行也可以通过 VACUUM 进行清理。

4.2.3. 手动执行 VACUUM

即使在一个空库中,你也可以手动执行 VACUUM 或 VACUUM ANALYZE 命令。这虽然不会清理已删除或更新的行,但是会更新系统的统计信息。

VACUUM ANALYZE;

请注意,在生产环境中,请谨慎使用 VACUUM FULL,因为它会锁定整个表,可能会影响数据库的可用性。

VACUUM FULL test_table;

这些操作将在表中创建已标记为"删除"或"更新"的行,然后执行 VACUUM 进行清理。请记住,在实际环境中,这些操作可能会影响到数据库的性能,请谨慎使用,并根据需求选择合适的方法来触发和了解 VACUUM 机制的工作原理。

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

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

相关文章

AIGC发展史

1 AIGC概况 1.1 AIGC定义 AIGC(AI Generated Content)是指利用人工智能技术生成的内容。它也被认为是继PGC,UGC之后的新型内容生产方式,AI绘画、AI写作等都属于AIGC的具体形式。2022年AIGC发展速度惊人,迭代速度更是呈现指数级发…

揭秘接口测试的必备基础知识!

这一篇讲接口测试的基础,如果你还在做手工测试,你可以从这里开始入门,做接口测试是最容易的一种自动化测试。 一、接口测试是什么 首先要理解接口测试就是测接口,如图所示: 让我们以数据驱动的视角来看接口测试&#…

AI生成视频-Pika

背景介绍 Pika 是一个使用 AI 生成和编辑视频的平台。它致力于通过 AI 技术使视频制作变得简单和无障碍。 Pika 1.0 是 Pika 的一个重大产品升级,包含了一个新的 AI 模型,可以在各种风格下生成和编辑视频,如 3D 动画,动漫,卡通和电影风格。…

亚马逊云科技向量数据库与生成式AI的完美融合:落地实践详解(四)

以往 OpenSearch 摄入时的一些最佳实践中并不包含 knn 的情况,所以在 knn 索引存在的情况,不能完全参照之前的结论,通过以上三种不同的实验方式,在多次实验的过程中,本文得到了以下的一些实践经验和结论,供…

java中 list.size() = 1 但显示 All elements are null

一、问题描述 serve层定义一个对象集合接收mybatis返回的结果,查询结果为空,但是接收集合对象长度却为1,集合内部显示All elements are null;导致在直接调用list集合中一些方法时导致报错java.lang.NullPointerException: null …

计数问题(数位DP)

题目大意:给定一个区间,求该区间内0 ~ 9出现的次数,多次询问,以0 0结束询问 测试用例: 输入: 1 10 44 497 346 542 1199 1748 1496 1403 1004 503 1714 190 1317 854 1976 494 1001 1960 0 0 输出&#xff…

CCF计算机软件能力认证考试—202209-1如此编码

题目背景 某次测验后,顿顿老师在黑板上留下了一串数字 23333 便飘然而去。凝望着这个神秘数字,小 P 同学不禁陷入了沉思…… 题目描述 已知某次测验包含 � 道单项选择题,其中第 � 题(1≤�≤&…

字符函数,字符串函数(C语言)

字符函数,字符串函数是C语言中非常重要的函数族,它们在日常的编程过程中被广泛使用。它们不仅能够大大提高我们的编程效率,还可以为我们提供更灵活、更高效的操作方法。在本篇博客中,我们将一起深入了解这二类函数的基本概念和使用…

在外包待了6年,技术退步太明显......

先说情况,大专毕业,18年通过校招进入湖南某软件公司,干了接近6年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&#xf…

关于队列的简单理解

1.队列(Queue) 1.1 关于队列 队列 :只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表, 队列具有先进先出 FIFO(First In First Out)的操作特性(队列是个接口); 入队列&#x…

外包干了2个月,技术倒退2年。。。

先说一下自己的情况,本科生,20年通过校招进入深圳某软件公司,干了接近4年的功能测试,今年国庆,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

图书馆智能密集书架怎么用的

图书馆智能密集书架是一种高密度存储书籍的设备,通过机器控制和操作,实现了对书籍的高效存储和检索。使用专久智能智能密集书架的方法如下: 1.先进行授权认证,确认身份和权限,进行操作前要确保权限正确,以免…

谨慎使用android.view.SurfaceView.setVisibility方法

谨慎使用android.view.SurfaceView.setVisibility方法 why? 原因就是此方法会导致native的内存暴增,前提条件你使用surfaceview去绘制一些复杂的3D图形,绘制复杂、业务复杂的场景; setVisibility方法会调用surfaceView的updateSurface,而此…

Python自动化——driver.switch_to的用法

driver.switch_to的用法 from selenium import webdriver driver webdriver.Chrome(/path/to/chromedriver) # Chrome driver.get(https://www.example.com) # 打开网页 element driver.find_element_by_id(element_id) # 查找元素记得在不需要使用 driver 时&#xff0c…

Android 使用aapt工具获取apk信息

aapt 工具的官网说明 https://developer.android.google.cn/studio/command-line/aapt2?hlzh_cn 功能有很多,本篇记录怎么使用aapt工具获取apk信息。 在 Aosp 源码下, 执行 source 、lunch 后,直接输入 aapt 就可以使用了。 不执行 sour…

CAPL接口

浮点和整形之间转换 interpretAsDword()//float转dword interpretAsFloat()//dword转float interpretAsQword()//double转qword interpretAsDouble()//gword转double常用字符串函数 strlen()//字符串长度 elCount()//数组的定义长度 strncat()//将源字符串拼接到到目的字符串…

日志JavaAgent-NoClassDefFoundError

一、引言 组内最近做了一个日志公共组件,用的是javaagent的方式,之前搞的maven jar包每次都要把所有系统都发一遍,太麻烦。 javaagent通过Java虚拟机(JVM)的Instrumentation API来实现代码的侵入。通过Instrumentation…

GNN Maximum Flow Problem (From Shusen Wang)

Maximum Flow Problem ShusenWang 图数据结构和算法课程笔记 Slides Maximum Flow Problem Description Naive Algorithm Residual Capacity - FlowLeft: Original GraphRight: Residual Graph - Bottleneck capacity 2- Iteration 2:- Find an augmenting path: s -&g…

HTTP会话技术---Cookie、Session和Token介绍及它们在JavaWeb中的使用

当涉及到Web应用程序的身份验证和状态管理时,我们通常会使用到Cookie、Session和Token这些会话技术。下面是对它们的介绍,并在JavaWeb中的示例 Cookie(HTTP Cookie) Cookie是一种存储在用户浏览器中的小型文本文件,由…

python import 顺序以及自动实现import 顺序更改

核心风格: import 语句的模块顺序 我们推荐所有的模块在 Python 模块的开头部分导入。 而且最好按照这样的顺序: 1. Python 标准库模块 2. Python 第三方模块 3. 应用程序自定义模块 Isort 自动整理 import 的超实用工具教程-CSDN博客 使用isort实现import的自动排序 1.安装…