说明 vacuum 和 autovacuum 的用途

已完成

更新行后,每次更新都由插入和删除组成。 插入修改的数据后将删除旧行。 PostgreSQL 中会保留原始行,因此在出现问题时事务可以回退。 不同于删除原始行,这会将其标记为稍后删除,从而导致仍在磁盘上但不再需要的“死”行(或元组)。

已正确命名的 vacuum 进程会永久删除这些行,回收可能丢失的空间,并更新统计信息。

清理死行的过程称为 vacuum 进程。 如果这些行保留在磁盘上,则数据库会占用更多的必需磁盘空间,这称为数据库“膨胀”。VACUUM 进程很重要,原因如下

  • 可恢复标记为要删除的行占用的磁盘空间。
  • 可更新数据统计信息以供查询规划程序使用。
  • 可更新可见性映射,从而加速仅索引扫描
  • 防止因事务 ID 回绕而导致的旧数据丢失。

PostgreSQL 使用名为 vacuum 的进程永久删除行,然后回收空间。 除了回收空间外,它还可确保索引有效。

自动触发 vacuum 进程后,该进程将称为 autovacuum。 该进程需要运行的频率取决于更新和删除操作的量。 还可以监视标记为要删除的行数。

定期运行 vacuum 进程可确保避免以下问题:

  • 出现“膨胀”现象,包括磁盘空间大于所需的数据库和表。
  • 出现欠佳的大型索引。
  • I/O 增加。

若要监视表中的“死”行数,可以运行 SELECT 查询:

SELECT relname, n_dead_tup, n_live_tup
FROM pg_catalog.pg_stat_all_tables
ORDER BY n_dead_tup DESC;

若要手动运行 vacuum 进程,请键入:

vacuum