Postgres:将填充因子设置为 50?
Postgres: Set fillfactor to 50?
我有一个 table 的记录按顺序填充一次,但随后 每个 记录都被更新(更新的顺序和更新的时间)更新都是随机的)。这些更新不是热更新。考虑到这些事实,将此 table 的填充因子设置为 50 或什至小于 50 是否有任何优势?
好的,正如您在对问题的评论中提到的,您正在 table 中使用事务在每个事务中更新 1-10k 条记录来进行更改。这是给 autovacuum 留下一些机会使其工作的正确方法。但是 table 的 fillfactor
并不是我 check/change 的第一件事。 Fillfactor 可以帮助您加快这个过程,但是如果 autovacuum 不够积极,您很快就会变得非常臃肿 table 并且性能很差。
所以,首先,我建议您控制 table 的腹胀程度。有许多查询可以帮助您:
- 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 调整到比默认状态更激进的状态,就像这样(这通常是个好主意,即使您不需要在短时间内处理整个 table),像这样:
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% 或更多元组的概率是多少单笔交易会更新页面吗?如果机会非常高,请降低填充因子。但是您已经提到 UPDATE 中的行顺序是随机的,所以我会使用 80-90%。请记住,这里有一个明显的权衡:如果将 fillfactor 设置为 50,您的 table 将需要 2 倍以上的磁盘 space 并且所有操作自然会变慢。如果您想深入了解这个问题,我建议使用相同的数据创建 21 tables,填充因子为 50..100,并使用 pgbench 测试 UPDATE TPS。
我有一个 table 的记录按顺序填充一次,但随后 每个 记录都被更新(更新的顺序和更新的时间)更新都是随机的)。这些更新不是热更新。考虑到这些事实,将此 table 的填充因子设置为 50 或什至小于 50 是否有任何优势?
好的,正如您在对问题的评论中提到的,您正在 table 中使用事务在每个事务中更新 1-10k 条记录来进行更改。这是给 autovacuum 留下一些机会使其工作的正确方法。但是 table 的 fillfactor
并不是我 check/change 的第一件事。 Fillfactor 可以帮助您加快这个过程,但是如果 autovacuum 不够积极,您很快就会变得非常臃肿 table 并且性能很差。
所以,首先,我建议您控制 table 的腹胀程度。有许多查询可以帮助您:
- 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 调整到比默认状态更激进的状态,就像这样(这通常是个好主意,即使您不需要在短时间内处理整个 table),像这样:
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% 或更多元组的概率是多少单笔交易会更新页面吗?如果机会非常高,请降低填充因子。但是您已经提到 UPDATE 中的行顺序是随机的,所以我会使用 80-90%。请记住,这里有一个明显的权衡:如果将 fillfactor 设置为 50,您的 table 将需要 2 倍以上的磁盘 space 并且所有操作自然会变慢。如果您想深入了解这个问题,我建议使用相同的数据创建 21 tables,填充因子为 50..100,并使用 pgbench 测试 UPDATE TPS。