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
