首页 > 解决方案 > Postgresql 自动清理耗时过长

问题描述

我有大约 5-6 百万个条目的 db 表,执行吸尘大约需要 20 分钟。由于该表的一个字段更新非常频繁,因此有很多死行需要处理。

估计一下,以我们当前的用户群,它每天可以有 200 万个死元组。所以,这个表的吸尘需要:

  1. 读取 IO:因为整个表不存在于共享内存中。
  2. 写入 IO:因为有很多条目要更新。

什么应该是清理这张桌子的理想方法?我应该增加autovacuum_cost_limit以允许每次 autovacuum 运行更多操作吗?但正如我所看到的,它会增加IOPS,这又可能会阻碍性能。目前,我有autovacuum_scale_factor = 0.2. 我应该减少它吗?如果我减少它,它会更频繁地运行,虽然写入 IO 会减少,但它会导致更多的时间段具有高读取 IO。

此外,随着用户群的增加,随着表大小的增加和真空度的增加,将不得不从磁盘读取大量数据,这将花费越来越多的时间。所以我该怎么做?

我想到的解决方案之一:

  1. 将高度更新的列分开并制作一个单独的表。
  2. 调整参数以使其更频繁地运行以减少写入 IO(如上所述)。如何处理更多读取 IO,因为真空现在会更频繁地运行?
  3. 将第 2 点与增加 RAM 相结合以减少读取 IO。

一般来说,人们采取的方法是什么,因为我认为人们必须有非常大的表 10GB 或更多,这需要被清理。

标签: postgresqlvacuum

解决方案


有两种方法:

  1. 减少autovacuum_vacuum_cost_delay该表,以便 autovacuum 变得更快。它仍然会消耗 I/O、CPU 和 RAM。

  2. fillfactor表的 设置为小于 100 的值,并确保您经常更新的列没有被索引。然后你可以获得不需要的HOT 更新VACUUM


推荐阅读