2

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

4

1 回答 1

2

您正在寻找的是我喜欢称之为“死空间平衡”。如果你有 1M 行并且你想删除和替换 100k 行,那么你可以用不同的方式来做。假设您删除 100k,并立即插入 100k。数据库没有时间清理那些旧的死行,所以现在你的 1M 行表中有 100k 死行。在接下来的 24 小时内,vacuum 将启动并将它们标记为已死,下次您删除/插入时,您将创建 100k 更多死行,然后重用(大部分)之前的 100k 死行。您的 1M 行表现在再次有大约 100k 死行,下次将被重用,依此类推。

您希望达到一个点,即您的删除/插入(或更新)和真空正在以均匀的速度创建/回收死元组。

于 2017-10-10T20:01:33.930 回答