本文介绍: 在 PostgreSQL 数据库中,VACUUM 是一种用于管理维护表的操作

1. 什么vacuum

1.1. 什么vacuum

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

1.1.1. 释放未使用空间

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

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

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

  1. 类型

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

  1. 自动执行

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

  1. 重要性

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

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

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

1.2.1. MySQL / MariaDB

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

1.2.2. Microsoft SQL Server

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

1.2.3. Oracle Database

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

1.2.4. SQLite

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

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

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

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

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

2. 1. 手动触发

2.2. 自动触发(autovacuum

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

2.3. 触发条件

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

2.4. 重要性

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

3. vacuum和开发语言的类比

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

3.1. VACUUM 与 JVM / GC 的类比

  1. VACUUM 和 GC 的作用类似

  2. 定期清理自动化执行

  3. 维护性能和资源管理

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

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

4. 如何查看复现vacuum

4.1. 查看vacuum

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

4.1.1. 查询系统视图

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

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

4.1.1.1 pg_stat_progress_vacuum

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

字段名 描述
pid VACUUM 进程进程 ID
datid 正在执行 VACUUM 的数据库 ID
relid 正在处理的表的 OID
phase VACUUM 的阶段扫描清理等)
heap_blks_total 表中需要扫描的块总数
heap_blks_scanned 扫描的表块数
heap_blks_vacuumed 清理的表块数
index_vacuum_count 已经清理索引
max_dead_tuples 目前已找到的任何一页中的最大元组数量
num_dead_tuples 处理的死元组总数
last_vacuum_time 最后一次 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 机制的工作原理

原文地址:https://blog.csdn.net/a13407142317/article/details/134799124

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_46114.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注