Autovacuum срабатывает, когда количество мёртвых кортежей превышает порог:

threshold + scale_factor × n_live_tup

По умолчанию: 50 + 0.2 × размер_таблицы. Для большой таблицы это слишком много — bloat накапливается быстро. Настроить на уровне таблицы:

ALTER TABLE orders SET (
  autovacuum_vacuum_scale_factor = 0.01,
  autovacuum_vacuum_threshold = 100
);

Смотреть когда последний раз убиралось и сколько мёртвых кортежей сейчас:

SELECT relname, n_dead_tup, last_autovacuum, last_autoanalyze
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC;

autovacuum_naptime (по умолчанию 1 мин) — как часто демон проверяет таблицы. На нагруженных базах снизить до 15s.

Если bloat растёт — смотреть pg_stat_activity: длинная транзакция держит xmin и блокирует очистку.

#postgresql #sysadmin #database