每天我从一张大表中删除数十万条记录,然后我进行一些计算(使用新数据)并替换我之前删除的每条记录。我认为经常做vacuum tbl
就可以了。我知道它不会将磁盘空间返回给服务器,但是(由于 pg 文档)我认为因为我插入的记录与删除的记录一样多,所以我不会丢失任何/太多的磁盘空间。但是,在将表移动到不同的命名空间后(出于不相关的原因),表从 117GB 变为 44GB!所以...
有没有比这更好的策略,所以我的桌子确实膨胀:
delete from tbl where ...etc... -- hundreds of thousands of rows removed
insert into tbl (...etc...) values (...etc...) -- hundreds of thousands of rows added back (fresh calcs)
.. repeat the above about 10 times a day ...
vacuum tbl
https://www.postgresql.org/docs/9.6/static/sql-vacuum.html
PostgreSQL 9.6
我实际上为减小表大小所做的事情在我的回答中: 整数超出范围和剩余磁盘空间太小,无法将 id 转换为 bigint 和其他解决方案
编辑1:缺点vacuum full
对我来说太局限了。我正在 24/7 处理东西,所以我不能有这样的锁,而且我的可用磁盘空间在任何时候都非常有限。试图以更好的方式解决这个问题。