说明 vacuum 和 autovacuum 的用途
更新行时,每个更新由插入和删除组成。 插入修改后的数据,并删除旧行。 在 PostgreSQL 中,保留原始行,以便在出现问题时事务可以回滚。 原始行不会被删除,而是被标记为稍后删除,结果是磁盘上仍然存在但不再需要的“死”行(或元组)。
已正确命名的 vacuum 进程会永久删除这些行,回收可能丢失的空间,并更新统计信息。
清理死行的过程称为 vacuum 进程。 如果这些行保留在磁盘上,数据库将占用所需的更多磁盘空间,称为数据库“膨胀”。 VACUUM 过程非常重要,原因如下:
- 可恢复标记为要删除的行占用的磁盘空间。
- 更新供查询规划器使用的数据统计信息。
- 可更新可见性映射,从而加速仅索引扫描。
- 防止因事务 ID 回绕而导致的旧数据丢失。
PostgreSQL 使用名为 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