【发布时间】:2020-07-13 15:01:49
【问题描述】:
我有大约 5-6 百万个条目的 db 表,执行清理大约需要 20 分钟。由于该表的一个字段更新非常频繁,因此有很多死行需要处理。
据估计,根据我们当前的用户群,每天可能有 200 万个死元组。所以,这个表的吸尘需要两个:
- 读取 IO:因为整个表不存在于共享内存中。
- 写入 IO:因为有很多条目要更新。
什么是清理这张桌子的理想方法?我是否应该增加 autovacuum_cost_limit 以允许每次 autovacuum 运行更多操作?但正如我所见,它会增加IOPS,这可能会再次阻碍性能。目前,我有autovacuum_scale_factor = 0.2。我应该减少它吗?如果我减少它,它会更频繁地运行,虽然写入 IO 会减少,但它会导致更多的时间段具有高读取 IO。
此外,随着用户群的增加,随着表大小的增加和真空度的增加,将需要从磁盘读取大量数据,这将花费越来越多的时间。那么,我该怎么办?
我想到的解决方案之一:
- 将高度更新的列分开,制作单独的表格。
- 调整参数以使其更频繁地运行以减少写入 IO(如上所述)。如何处理更多读取 IO,因为真空现在会更频繁地运行?
- 将第 2 点与增加 RAM 相结合以减少读取 IO。
一般来说人们采取的方法是什么,因为我假设人们必须有非常大的表 10GB 或更多,这需要被清理。
【问题讨论】:
-
你的 PostgreSQL 版本是多少?
-
@jjanes 我正在使用 postgresql 11
-
你的桌子有多大?您稍后提到 10GB 用于假设表,这是您表的大小吗?这是否使平均元组宽度约为 1800 字节?
-
没有。我的表(不包括索引)大约 1.5 GB(6 百万行)。我想知道如果我在一段时间内达到那个尺寸会发生什么。
-
我应该将该列分开,以便每个元组的大小对于真空来说很小吗?
标签: postgresql vacuum