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

7

我有一张记录表,它是按顺序填充的,但是然后每个记录都会被更新(更新的顺序和时间都是随机的)。这些更新不是HOT更新。考虑到这些事实,如果将这个表的fillfactor设置为50,甚至低于50,是否有优势?


每个记录都在单个事务中更新吗?如果是这样,无论任何设置,自动清理都不会很高兴。 - Nick
这是一个有3000万行记录的表。每个记录在事务中被更新,事务大小在大约1000到10000条记录之间(有时候),也会完全随机地以1条记录的事务大小进行更新(有时候)。 - carbocation
1个回答

10

好的,根据你在问题评论中提到的,你正在使用事务对表进行更改,每个事务更新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。


谢谢,这是一个非常周到的答案。它解决了我关于如何最好地考虑填充因子的根本问题,并给了我解决根本问题的建议。 - carbocation
我想补充一下,HOT仅在更新非索引字段时才起作用。 - Fyzzys

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接