For about fifteen years, the standard answer to “this table is bloated, what do I actually do about it” has been one of the out-of-tree options: pg_repack (the extension), pg_squeeze (Antonin...
PostgreSQL 19引入了REPACK的CONCURRENTLY选项,允许在不获取独占锁的情况下重组表。该功能通过共享更新锁创建初始副本,并利用并发后台工作者进行逻辑解码。尽管存在复制槽资源稀缺和死锁风险等问题,但设计和代码已基本完成,预计将在后续更新中解决。测试结果显示,重组后表大小显著减少,插入性能略有下降,但整体影响不大。
PostgreSQL 19的新特性REPACK通过重写表来物理压缩数据,类似于VACUUM,但创建新文件而非清理现有页面。REPACK CONCURRENTLY允许在操作期间保持表可用,使用快照复制并重放并发更改,确保逻辑身份不变,同时有效回收磁盘空间。
PostgreSQL 19引入了REPACK命令,整合了VACUUM FULL和CLUSTER的功能,简化了用户理解,同时保留了旧命令。REPACK支持重写表以回收磁盘空间,并提供新的进度视图pg_stat_progress_repack。尽管当前不支持并发模式,但未来可能会增加此功能。该命令使用简单,允许用户选择VERBOSE和ANALYZE等选项。
PostgreSQL引入了pg_repack扩展来解决表中的膨胀和碎片化问题。与VACUUM FULL不同,pg_repack允许在线重建表而无需锁定表。操作过程中,pg_repack创建日志表,添加触发器,创建影子表,构建索引,应用更改,交换表,并删除原始表。重要选项包括指定并行连接数,执行在线VACUUM FULL,设置等待超时和绕过超级用户验证。限制包括不能重新组织临时表或通过GiST索引对聚簇表进行重组。建议在低活动期间安排pg_repack,并避免过度使用。
As the database size increases and the number of transactions per second rise, you'll inevitably face the challenge of the table bloat. Although PostgreSQL assists as much as possible with its...
本文介绍了在PostgreSQL中重建表的方法,包括使用VACUUM FULL命令的限制,Oracle中使用DBMS_REDEFINITION包的手动步骤,以及PostgreSQL中的pg_repack扩展。pg_repack可以在不中断读写操作的情况下重建表,并有效去除碎片。使用pg_repack重建表简单且提高数据库性能和存储利用率。
完成下面两步后,将自动完成登录并继续当前操作。