postgresql - Postgresql 自动清理耗时过长
问题描述
我有大约 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 或更多,这需要被清理。
解决方案
有两种方法:
减少
autovacuum_vacuum_cost_delay
该表,以便 autovacuum 变得更快。它仍然会消耗 I/O、CPU 和 RAM。将
fillfactor
表的 设置为小于 100 的值,并确保您经常更新的列没有被索引。然后你可以获得不需要的HOT 更新VACUUM
。
推荐阅读
- php - 在多维数组中查找重复值
- amazon-web-services - 是否可以指示 AWS 自定义授权者根据阶段变量调用 AWS Lambda?
- xml - XSI 命名空间复制到结果序列
- javascript - 弹出窗口应每次访问显示一次,而是每次显示
- gruntjs - grunt-modernizr 没有输出
- mule - 在 mule 中从 FTP 读取文件
- java - 如果应用程序当前无法处理从 MQ 异步获取的 get 消息,它会保留在哪里?
- linux - 某些目录中的文件可能与隐式目录中的库冲突
- python - Tkinter 画布未显示
- python - 使用 google places api 时工作计算机上的错误 10060