Postgres:将fillfactor设置为50?

时间:2017-07-13 17:50:47

标签: postgresql fillfactor

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

1 个答案:

答案 0 :(得分:4)

好的,正如您在问题的评论中提到的那样,您使用在每笔交易中更新1-10k记录的交易在您的表格中进行更改。这是正确的方法,留下一些机会autovacuum使其工作。但是表fillfactor并不是我检查/更改的第一件事。 Fillfactor可以帮助你加快这个过程,但如果autovacuum不够激进,你很快就会得到非常臃肿的表格和糟糕的表现。

所以,首先,我建议你控制你的桌子的膨胀水平。有许多问题可以帮助您:

接下来,我将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进行大量交易后,请检查膨胀水平。

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