在 PostgreSQL 中,VACUUM
是一个用于清理数据库的命令。它的主要作用是回收不再使用的空间,从而优化数据库的性能。VACUUM
会执行以下操作:
- 回收空间:删除已删除行的空间,使其可以被后续的插入操作重用。
- 更新统计信息:更新表的统计信息,以帮助查询优化器做出更好的执行计划。
- 防止事务 ID 溢出:在 PostgreSQL 中,每个事务都有一个唯一的 ID,
VACUUM
可以帮助防止这些 ID 溢出,从而导致数据库出现问题。
VACUUM
有两种主要形式:
- 普通 VACUUM:只会回收空间,不会阻止其他事务的执行。
- VACUUM FULL:会锁定表,重建表并回收所有未使用的空间,通常会释放大量的磁盘空间,但会导致更长的锁定时间。
使用 VACUUM
可以帮助保持数据库的性能和稳定性,特别是在频繁进行插入、更新和删除操作的环境中。
如果想要获取 VACUUM
的执行状态,可以使用以下 SQL 语句:
SELECT c.relname AS table_name,-- 表名 ROUND((p.heap_blks_scanned::numeric / p.heap_blks_total * 100), 2) AS scanned, -- 扫描进度 ROUND((p.heap_blks_vacuumed::numeric / p.heap_blks_total * 100), 2) AS vacuumed, -- 整理进度 p.* FROM pg_stat_progress_vacuum p JOIN pg_class c ON p.relid = c.oid WHERE c.relkind = 'r' ORDER BY c.relname ;