"replacement inserts" 的最佳磁盘节省策略

best disk saving strategy for "replacement inserts"

每天我都会从一个大的 table 中删除数十万条记录,然后我会做一些计算(使用新数据)并替换我之前删除的每一条记录。我认为定期 vacuum tbl 会成功。我知道它不会 return 磁盘 space 到服务器,但是(因为 pg 文档)我想因为我插入的记录和删除的记录一样多,所以我不会松动 any/much磁盘space。然而,在将 table 移动到不同的名称 space 之后(出于不相关的原因),table 从 117GB 变成了 44GB!所以...

有没有比这更好的策略所以我的 table 确实膨胀了:

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

我为减少 table 大小所做的实际工作在我的回答中:

编辑 1: vacuum full 的缺点对我来说太局限了。我正在 24/7 处理东西,所以我不能有那样的锁,而且我的可用磁盘 space 在任何时间点都非常有限。尝试以更好的方式解决这个问题。

您要找的是 "dead space equilibrium",我喜欢这样称呼它。如果你有 100 万行并且你想要删除和替换 100k 行,那么你可以通过不同的方式来完成。假设您删除 100k,然后立即插入 100k。数据库没有时间清理那些旧的死行,所以现在您的 1M 行 table 中有 100k 死行。在接下来的 24 小时内,vacuum 将启动并将它们标记为死行,下次删除/插入时,您将再创建 100k 死行,然后重用(大部分)之前的 100k 死行。您的 100 万行 table 现在又有约 10 万行死行,下次将重新使用,依此类推。

您想达到 deletes/inserts(或更新)和 vacuum 以均匀速率创建/回收死元组的程度。