Postgres: установить коэффициент заполнения на 50?
У меня есть таблица записей, которая заполняется последовательно один раз, но затем обновляется каждая запись (порядок, в котором они обновляются, и сроки обновлений являются случайными). Обновления не ГОРЯЧИЕ обновления. Есть ли какое-либо преимущество в том, чтобы установить мой коэффициент заполнения для этой таблицы равным 50 или даже меньше 50, учитывая эти факты?
1 ответ
Хорошо, как вы упомянули в комментариях к вашему вопросу, вы вносите изменения в свою таблицу, используя транзакции, обновляя записи по 1-10 тыс. В каждой транзакции. Это правильный подход, оставляющий некоторые шансы на автовакуумную работу. Но стол fillfactor
это не первое, что я бы проверял / менял. Fillfactor может помочь вам ускорить процесс, но если автовакуум недостаточно агрессивен, вы скоро получите очень раздутый стол и плохую производительность.
Итак, во-первых, я бы посоветовал вам контролировать уровень вздутие живота вашего стола. Существует ряд запросов, которые могут вам помочь:
- 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)
Затем я бы настроил автовакуум на гораздо более агрессивное состояние, чем по умолчанию, например, так (обычно это хорошая идея, даже если вам не нужно обрабатывать всю таблицу за короткий промежуток времени), примерно так:
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% или более кортежей внутри страницы будут обновлены единственная транзакция? Если шансы очень высоки, уменьшите коэффициент заполнения. Но вы упомянули, что порядок строк в ОБНОВЛЕНИЯХ является случайным, поэтому я бы использовал 80-90%. Имейте в виду, что здесь есть очевидный компромисс: если вы установите fillfactor равным 50, вашей таблице потребуется в 2 раза больше дискового пространства, и все операции, естественно, станут медленнее. Если вы хотите углубиться в этот вопрос, я предлагаю создать 21 таблицу с коэффициентами заполнения 50..100 с теми же данными и протестировать TPS UPDATE с помощью pgbench.