大批量 INSERTs/UPDATEs 和 DELETEs 性能问题

xen*_*xen 6 postgresql

我在寻找解决以下问题的最佳选择时遇到了问题(postgres 9.5):

我一次从另一个系统获得大约 100.000 行的更新批次。这种情况通常每 10-15 分钟发生一次,但我可能会同时收到多个批次。批次由“类别”分隔,一个批次只包含来自一个批次的数据。每个“类别”每 10-15 分钟更新一次。新行被插入,旧行被删除,仍然存在的行应该更新为新值。

这带来了表产生大量垃圾数据、VACUUM 进程运行非常缓慢以及一般表性能非常差的问题。

现在我想我可以通过为数据中的每个“类别”创建子表并因此“分片”数据来解决这个问题。

在这种情况下,这是否有意义,还是有更好的选择让我坚持?

jja*_*nes 1

清理速度慢是因为 IO 吞吐量不足,还是仅仅因为它受到太多限制?

autovacuum 的默认限制不适合写入非常密集的服务器。您可能应该减少autovacuum_vacuum_cost_delay或增加vacuum_cost_limit。我通常将vacuum_cost_page_hit 和vacuum_cost_page_miss 设置为零。页面丢失本质上是自我限制的,因为在页面交付之前清理过程无法继续;因此没有理由在此基础上添加有意的限制。