advanced

Vacuum basics

Понимайте MVCC cleanup, bloat, autovacuum thresholds, freeze и почему long transactions вредят operations.

MVCC в PostgreSQL хранит старые версии строк, пока vacuum не освободит dead tuples. Без vacuum — bloat таблиц, раздувание индексов и риск wraparound transaction id.

| Понятие | Смысл | |---------|-------| | Dead tuples | Старые версии строк, невидимые новым снимкам | | Autovacuum | Фоновый worker по порогам | | VACUUM | Освобождает место для повторного использования (часто не ОС) | | VACUUM FULL | Перезапись таблицы — блокировки, риск downtime | | Freeze | Сдвигает xmin horizon против XID wraparound |

					-- Сигналы bloat
SELECT relname, n_dead_tup, last_autovacuum, last_autoanalyze
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC;

-- Длинные транзакции блокируют cleanup
SELECT pid, state, xact_start, query
FROM pg_stat_activity
WHERE state != 'idle' AND xact_start < now() - interval '1 hour';
				

Таблицы с высоким churn нуждаются в настройке autovacuum (`autovacuum_vacuum_scale_factor`, per-table parameters). Долгие транзакции, включая idle in transaction, мешают cleanup и дают bloat.

На интервью: почему UPDATE/DELETE не освобождают диск сразу; что делает autovacuum; зачем следить за dead tuples и oldest xmin.

Типовые ошибки: отключение autovacuum; VACUUM FULL в prod без окна; открытые ORM-сессии; игнор bloat на часто обновляемом JSONB.

Компромисс — конкурентность MVCC против фонового обслуживания; здоровая политика vacuum — часть эксплуатации PostgreSQL, а не «опция для DBA».

Чеклист:

  • Мониторьте dead tuples и отставание autovacuum.
  • Избегайте долгоживущих транзакций.
  • Настройте autovacuum на горячих таблицах.
  • Планируйте борьбу с bloat без безрассудного VACUUM FULL.