VACUUM 是 PostgreSQL 数据库中用于维护表数据、优化存储与性能的核心维护命令,主要服务于 PostgreSQL 的 MVCC(多版本并发控制)机制,具体说明如下:
- 核心功能:清理表中 “死元组”(即被更新 / 删除后不再使用的旧数据版本),释放其占用的存储空间;同时更新表的统计信息(配合
ANALYZE时),确保查询优化器生成高效执行计划。 - 常见类型:
- 普通 VACUUM:轻量级操作,不锁表(仅加共享锁),原地清理死元组并将空间标记为可复用,但不会将空间归还操作系统。
- VACUUM FULL:重写整张表,彻底回收死元组空间并归还操作系统,但会对表加排它锁,执行期间表无法被写入。
- VACUUM ANALYZE:同时完成死元组清理与统计信息更新,是日常维护的常用方式。
- 自动维护:PostgreSQL 默认启用
autovacuum(自动 VACUUM)进程,会定期检测表的死元组占比,自动执行 VACUUM/ANALYZE,避免手动操作的遗漏。
VACUUM 的常用操作命令及对应场景示例,按维护需求分类整理:
1. 基础轻量清理(普通 VACUUM)
- 操作命令:普通 VACUUM
- 语法示例:sql
-- 清理指定表 VACUUM public.user_info; -- 清理当前数据库所有表(大库不推荐,耗时久) VACUUM; - 适用场景:表经过少量 UPDATE/DELETE 操作后,轻量清理 “死元组”,并将释放的空间标记为表内可复用(不归还操作系统);仅加共享锁,不阻塞表的读写,适合日常高频维护(如业务低峰期的常规清理)。
2. 清理 + 更新统计信息(VACUUM ANALYZE)
- 操作命令:VACUUM ANALYZE
- 语法示例:sql
-- 清理指定表并更新其统计信息 VACUUM ANALYZE public.order_data; - 适用场景:表完成大量数据变更(如批量导入、批量更新 / 删除)后,既清理死元组,又更新表的统计信息(供查询优化器生成高效执行计划);是业务变更后优化查询性能的常用操作。
3. 彻底空间回收(VACUUM FULL)
- 操作命令:VACUUM FULL(可搭配 VERBOSE 查看详情)
- 语法示例:sql
-- 彻底清理指定表并归还空间给操作系统(加VERBOSE输出详情) VACUUM FULL VERBOSE public.old_log_table; - 适用场景:表的死元组占比极高(如超过 50%),需要彻底回收空间并归还操作系统;但会对表加排它锁,阻塞表的读写,仅适合业务低谷 / 维护窗口执行(如历史日志表的定期瘦身)。
4. 带详情 / 特殊参数的 VACUUM
(1)查看清理详情(VACUUM VERBOSE)
- 语法示例:sql
VACUUM VERBOSE public.product_info; - 适用场景:排查表的空间占用问题(如确认死元组数量、回收空间大小),或验证清理操作的执行效果。
(2)冻结事务 ID(VACUUM FREEZE)
- 语法示例:sql
-- 冻结表的旧事务ID,防止事务ID回卷 VACUUM FREEZE VERBOSE public.historical_data; - 适用场景:表的
relfrozenxid(可通过SELECT relname, relfrozenxid FROM pg_class WHERE relname='表名';查看)接近 “事务 ID 回卷阈值”,手动冻结旧事务 ID,避免数据库可用性风险。
5. 自动 VACUUM 的补充说明
PostgreSQL 默认启用autovacuum进程,会自动检测表的死元组占比并执行清理;若自动 VACUUM 未及时触发(如数据变更频率极低 / 极高),可通过上述普通 VACUUM/VACUUM ANALYZE手动替代执行。

徐万新之路

