Postgres:将填充因子设置为 50?

Postgres: Set fillfactor to 50?

我有一个 table 的记录按顺序填充一次,但随后 每个 记录都被更新(更新的顺序和更新的时间)更新都是随机的)。这些更新不是热更新。考虑到这些事实,将此 table 的填充因子设置为 50 或什至小于 50 是否有任何优势?

好的,正如您在对问题的评论中提到的,您正在 table 中使用事务在每个事务中更新 1-10k 条记录来进行更改。这是给 autovacuum 留下一些机会使其工作的正确方法。但是 table 的 fillfactor 并不是我 check/change 的第一件事。 Fillfactor 可以帮助您加快这个过程,但是如果 autovacuum 不够积极,您很快就会变得非常臃肿 table 并且性能很差。

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

接下来,我会将 autovacuum 调整到比默认状态更激进的状态,就像这样(这通常是个好主意,即使您不需要在短时间内处理整个 table),像这样:

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 进行大量事务后,检查膨胀级别。

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