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

2023-12-05 23:45

本文主要是介绍试着总结一下: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 机制的工作原理。

这篇关于试着总结一下:pg的vacuum机制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

状态dp总结

zoj 3631  N 个数中选若干数和(只能选一次)<=M 的最大值 const int Max_N = 38 ;int a[1<<16] , b[1<<16] , x[Max_N] , e[Max_N] ;void GetNum(int g[] , int n , int s[] , int &m){ int i , j , t ;m = 0 ;for(i = 0 ;

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

【Tools】大模型中的自注意力机制

摇来摇去摇碎点点的金黄 伸手牵来一片梦的霞光 南方的小巷推开多情的门窗 年轻和我们歌唱 摇来摇去摇着温柔的阳光 轻轻托起一件梦的衣裳 古老的都市每天都改变模样                      🎵 方芳《摇太阳》 自注意力机制(Self-Attention)是一种在Transformer等大模型中经常使用的注意力机制。该机制通过对输入序列中的每个元素计算与其他元素之间的相似性,