我有一个按顺序填充一次的记录表,但随后每条记录都会更新(它们的更新顺序和更新时间都是随机的)。这些更新不是热门更新。考虑到这些事实,将此表的填充因子设置为 50 甚至小于 50 有什么好处吗?
1 回答
好的,正如您在对问题的评论中提到的那样,您正在使用在每个事务中更新 1-10k 记录的事务来更改表。这是正确的方法,给 autovacuum 留下一些机会使其工作。但是表fillfactor
不是我要检查/更改的第一件事。Fillfactor 可以帮助您加快处理速度,但如果 autovacuum 不够积极,您很快就会得到非常臃肿的表格和糟糕的性能。
所以,首先,我建议你控制你的桌子的膨胀程度。有许多查询可以帮助您:
- 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 扩展)
接下来,我会将 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。