【问题标题】:Postgres: Set fillfactor to 50?Postgres:将填充因子设置为 50?
【发布时间】:2017-07-13 17:50:47
【问题描述】:

我有一个按顺序填充一次的记录表,然后每条记录都会更新(更新顺序和更新时间都是随机的)。这些更新不是热门更新。考虑到这些事实,将此表的填充因子设置为 50 甚至小于 50 有什么好处?

【问题讨论】:

  • “每条记录都更新”在单个事务中?如果是这样,无论设置如何,autovacuum 都不会满意。
  • 这是一个 3000 万行的表。每条记录在大约 1,000 到 10,000 条记录(有时)之间的事务中更新,并且在 1 条记录大小的事务中(有时)完全随机更新。

标签: postgresql fillfactor


【解决方案1】:

好的,正如您在问题的 cmets 中提到的那样,您正在使用在每个事务中更新 1-10k 记录的事务对表进行更改。这是正确的方法,给 autovacuum 留下一些机会使其工作。但是表的fillfactor 不是我要检查/更改的第一件事。 Fillfactor 可以帮助您加快处理速度,但如果 autovacuum 不够积极,您很快就会得到非常臃肿的表格和糟糕的性能。

所以,首先,我建议您控制桌子的膨胀程度。有许多查询可以帮助您:

接下来,我会将 autovacuum 调整为比默认状态更激进的状态,如下所示(即使您不需要在短时间内处理整个表,这通常也是个好主意),如下所示:

log_autovacuum_min_duration = 0
autovacuum_vacuum_scale_factor = 0.01
autovacuum_analyze_scale_factor = 0.05
autovacuum_naptime = 60
autovacuum_vacuum_cost_delay = 20

在使用 UPDATE 进行大量事务后,检查膨胀程度。

最后,是的,我会调整填充因子,但可能会调整为更高(和更常见)的值,例如 80 或 90 - 在这里您需要做出一些预测,页面内 10% 或更多元组的概率是多少由单笔交易更新?如果机会非常高,请降低填充因子。但是您已经提到 UPDATE 中的行顺序是随机的,所以我会使用 80-90%。请记住,这里有一个明显的权衡:如果将 fillfactor 设置为 50,您的表将需要 2 倍的磁盘空间,并且所有操作自然会变慢。如果您想深入了解这个问题,我建议使用相同的数据创建 21 个填充因子为 50..100 的表,并使用 pgbench 测试 UPDATE TPS。

【讨论】:

  • 谢谢,这是一个非常周到的答案。它解决了我关于如何最好地考虑填充因子的基本问题,并为我提供了如何解决我的基本问题的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-20
  • 1970-01-01
相关资源
最近更新 更多