我有一张记录表,它是按顺序填充的,但是然后每个记录都会被更新(更新的顺序和时间都是随机的)。这些更新不是HOT更新。考虑到这些事实,如果将这个表的fillfactor设置为50,甚至低于50,是否有优势?
我有一张记录表,它是按顺序填充的,但是然后每个记录都会被更新(更新的顺序和时间都是随机的)。这些更新不是HOT更新。考虑到这些事实,如果将这个表的fillfactor设置为50,甚至低于50,是否有优势?
好的,根据你在问题评论中提到的,你正在使用事务对表进行更改,每个事务更新1-10k条记录。这是正确的方法,留下一些机会让自动清理完成其工作。但是表的fillfactor
不是我要检查/更改的第一件事。填充因子可以帮助您加快进程,但如果自动清理不够积极,您很快就会得到非常臃肿的表和糟糕的性能。
所以,首先,我建议您控制表的膨胀水平。有许多查询可以帮助您:
接下来,我会将自动清理调整为比默认更积极的状态,例如(即使您不需要在短时间内处理整个表,这通常是个好主意),类似于以下内容:
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%或更多元组的概率是多少?如果机会非常高,请减少fillfactor。但是,您已经提到了UPDATE中行的顺序是随机的,因此我会使用80-90%。请记住,这里存在明显的权衡:如果将fillfactor设置为50,则表格将需要2倍的磁盘空间,并且所有操作自然会变得更慢。如果您想深入探讨这个问题,我建议创建21个具有相同数据的fillfactors 50..100的表格,并使用pgbench测试UPDATE TPS。