解释 vacuum 和 autovacuum 的作用
更新行时,每个更新由插入和删除组成。 插入修改后的数据,并删除旧行。 在 PostgreSQL 中,保留原始行,以便在出现问题时事务可以回滚。 原始行不会被删除,而是被标记为稍后删除,结果是磁盘上仍然存在但不再需要的“死”行(或元组)。
已命名的清空进程会永久删除这些行,回收可能丢失的空间,并更新统计信息。
清理死行的过程称为真空过程。 如果这些行保留在磁盘上,数据库将占用所需的更多磁盘空间,称为数据库“膨胀”。 VACUUM 过程非常重要,原因如下:
- 恢复标记为要删除的行占用的磁盘空间。
- 更新供查询规划器使用的数据统计信息。
- 可更新可见性映射,从而加速仅索引扫描。
- 防止因事务 ID 回绕而导致的旧数据丢失。
PostgreSQL 使用名为 vacuum 的过程永久删除行并回收空间。 除了回收空间外,它还可确保索引的有效性。
当真空过程被自动触发时,该过程称为autovacuum。 进程需要运行的频率取决于更新和删除作的数量。 还可以监视标记为要删除的行数。
定期运行真空过程可确保不会:
- 出现“膨胀”现象,包括磁盘空间大于所需的数据库和表。
- 有较大且效果不佳的索引。
- 提升的 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