“替换插件”的最佳磁盘保存策略

时间:2017-10-10 19:30:48

标签: postgresql disk diskspace vacuum

每天我从大表中删除数十万条记录,然后进行一些计算(使用新数据)并替换之前删除的每条记录。我认为定期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的缺点对我来说太有限了。我正在全天候处理东西所以我不能拥有这样的锁,我的​​可用磁盘空间在任何时候都非常有限。试着以更好的方式解决这个问题。

1 个答案:

答案 0 :(得分:2)

您正在寻找的是"死区平衡"因为我喜欢称之为。如果您已经说过1M行并且想要删除并替换100k行,那么您可以通过不同方式执行此操作。我们假设您删除100k,并立即插入100k。 db没有时间来清空那些旧的死行,所以现在你的1M行表中有100k的死行。在接下来的24小时内,真空将启动并标记它们已经死亡,下次删除/插入时,您将再创建10万个死行,然后重复使用(大部分)之前的100k死行。你的1M行表现在再次有大约100k的死行,下次会重复使用,依此类推。

您希望达到删除/插入(或更新)和真空以均匀速率创建/回收死元组的位置。