每天我从大表中删除数十万条记录,然后进行一些计算(使用新数据)并替换之前删除的每条记录。我认为定期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
我实际上做了什么来缩小表格大小在我的答案中: integer out of range and remaining disk space too small to convert id to bigint and other solutions
编辑1:
vacuum full
的缺点对我来说太有限了。我正在全天候处理东西所以我不能拥有这样的锁,我的可用磁盘空间在任何时候都非常有限。试着以更好的方式解决这个问题。
答案 0 :(得分:2)
您正在寻找的是"死区平衡"因为我喜欢称之为。如果您已经说过1M行并且想要删除并替换100k行,那么您可以通过不同方式执行此操作。我们假设您删除100k,并立即插入100k。 db没有时间来清空那些旧的死行,所以现在你的1M行表中有100k的死行。在接下来的24小时内,真空将启动并标记它们已经死亡,下次删除/插入时,您将再创建10万个死行,然后重复使用(大部分)之前的100k死行。你的1M行表现在再次有大约100k的死行,下次会重复使用,依此类推。
您希望达到删除/插入(或更新)和真空以均匀速率创建/回收死元组的位置。