PostgreSQL 19: 引入原生 REPACK 命令

John Doe 三月 12, 2026

忘掉 VACUUM 和 CLUSTER 命令吧,现在有了新的 REPACK 命令。

image

特性提交日志

引入 REPACK 命令。

REPACK 将 VACUUM FULL 和 CLUSTER 的功能整合到一条命令中。由于这部分功能与常规的 VACUUM 完全不同,将其从 VACUUM 中独立出来,能让用户更容易理解;而对于 CLUSTER 来说,“cluster” 这个术语在 IT 领域、甚至在 PostgreSQL 内部都已经过度滥用,因此能避免使用它是一件好事。

我们会保留这些旧命令,但在文档中不再重点推荐,转而推荐使用 REPACK;VACUUM FULL 与 CLUSTER 之间的区别(即元组会按特定顺序写入)被清晰地收纳为 REPACK 的两种不同模式。

这使得我们未来可以引入更多通用功能,无论是否使用排序都能生效,例如(并且尤其重要的)并发模式。

讨论:https://postgr.es/m/202507262156.sb455angijk6@alvherre.pgsql

特性解析

本次提交正式引入了原生REPACK命令,整合了原有VACUUM FULL(表空间收缩)与CLUSTER(索引有序重排)的核心能力,解决了旧命令语义模糊、运维黑盒的痛点,同时为未来并发模式等扩展预留了架构空间,旧命令完整保留以保障向下兼容。

1. 双模式统一语法

  • 基础模式:REPACK table_name; 等价于VACUUM FULL,消除表内死元组、重整数据、收缩磁盘空间,解决表膨胀问题;
  • 索引排序模式:REPACK table_name USING INDEX idx_name; 等价于CLUSTER,按指定索引物理重排表数据,同步完成空间收缩,大幅提升范围查询性能。

2. 全流程可观测:新增pg_stat_progress_repack系统视图,实时展示执行阶段、堆元组扫描 / 写入量、索引重建进度等核心指标,彻底解决旧命令执行黑盒问题。

3. 平滑兼容:保留VACUUM FULLCLUSTER命令,仅在官方文档中弱化引导使用REPACK,原有业务无需修改即可平滑升级。

重点场景

1. 表膨胀快速治理:业务频繁更新 / 删除导致表膨胀、磁盘占用过高,无需区分复杂语法,一键执行REPACK完成空间回收,消除死元组带来的查询性能下降。

2. 范围查询性能优化:针对按时间、ID 等字段做高频范围扫描的业务表,通过REPACK ... USING INDEX按索引物理排序数据,减少随机 IO,可让范围查询性能提升数倍。

3. 大表运维可控化:对大表执行重整时,通过进度视图实时查看执行阶段与进度,预估剩余耗时,避免长运维操作的不可控风险。

总结

REPACK命令统一了 PostgreSQL 表物理重整的核心能力,大幅降低了用户的学习与运维成本,同时完善了执行全流程的可观测性,是 PostgreSQL 表运维体系的重要升级。

非常不错的体验,感谢所有参与的社区人员。

参考

提交日志:https://git.postgresql.org/pg/commitdiff/ac58465e0618941842439eb3f5a2cf8bebd5a3f1