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



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

好的,正如您在问题的评论中提到的,您正在使用在每个事务中更新 1-10k 条记录的事务在表中进行更改。这是正确的方法,为自动吸尘留下了一些机会来使其工作。但是表的fillfactor不是我要检查/更改的第一件事。Fillfactor可以帮助您加快该过程,但是如果自动真空不够激进,您很快就会得到非常臃肿的桌子和糟糕的性能。

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

  • https://wiki.postgresql.org/wiki/Show_database_bloat
  • http://blog.ioguix.net/postgresql/2014/09/10/Bloat-estimation-for-tables.html
  • https://github.com/ioguix/pgsql-bloat-estimation/blob/master/table/table_bloat-82-84.sql
  • https://github.com/dataegret/pg-utils/blob/master/sql/table_bloat.sql (对于索引:
  • https://github.com/dataegret/pg-utils/blob/master/sql/index_bloat.sql; 这些查询需要 PGSTATTUPLE 扩展)

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

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。

最新更新