全部术语

VACUUM 与 autovacuum

PostgreSQL 中的 VACUUM 有什么作用?

VACUUM 回收更新和删除操作遗留的死行版本所占用的空间,更新可见性映射,并防止事务 ID 回卷。autovacuum 会自动为你运行它。

由于 MVCC 机制,PostgreSQL 中的 UPDATE 或 DELETE 不会立即删除旧的行版本;当没有任何事务还能看到旧版本时,它就成为死元组(dead tuple)。VACUUM 会找到死元组,并将其空间标记为可供同一张表中的新行重用。

普通的 VACUUM 与正常的读写操作并行运行,通常不会缩小表在磁盘上的文件。VACUUM FULL 会重写整张表,把空间归还给操作系统,但在整个过程中都会持有排他锁。VACUUM 还会更新可见性映射(这有助于仅索引扫描),并冻结旧行以防止事务 ID 回卷。autovacuum 守护进程会自动运行 VACUUM 和 ANALYZE,因此手动运行主要在大批量修改之后才有用。

示例

该示例更新表中的每一行,留下 10,000 个死行版本,然后运行 VACUUM (VERBOSE) 报告清理了哪些内容。随后的统计信息查询显示该表最近一次手动 VACUUM 的时间。

CREATE TABLE items (id int PRIMARY KEY, qty int);
INSERT INTO items SELECT g, 0 FROM generate_series(1, 10000) AS g;
UPDATE items SET qty = qty + 1;

VACUUM (VERBOSE) items;

SELECT relname, last_vacuum, n_dead_tup
FROM pg_stat_user_tables
WHERE relname = 'items';

适用于原生 PostgreSQL 16 或 17 的纯 SQL,无需任何扩展。请在一个可随时丢弃的空数据库中运行。

参考资料

PostgreSQL 官方文档(英文)。

相关术语