Postgres VACUUM и bloat на собеседовании Data Engineer

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

Карьерник — Duolingo для аналитиков: 10 минут в день тренируй SQL, Python, A/B, статистику, метрики и ещё 3 темы собеса. 1500+ вопросов в Telegram-боте. Бесплатно.

Зачем VACUUM

Postgres MVCC — UPDATE / DELETE не remove rows immediately. Stay as «dead tuples». VACUUM cleans up.

Без vacuum — table bloated, indexes bloated, queries slow.

Dead tuples

UPDATE users SET name = 'New' WHERE id = 42;

Под капотом:

1. Old row marked dead (xmin / xmax).
2. New row inserted с new timestamp.
3. Reads с newer snapshots see new row, older — old.

После all transactions older чем dead row's xmax — dead row safely vacuumed.

Autovacuum

Background process. Triggered когда:

  • Dead tuples > autovacuum_vacuum_threshold (default 50) + scale_factor (20%).
ALTER TABLE big_table SET (autovacuum_vacuum_scale_factor = 0.05);

Per-table tuning часто helpful.

Long-running transactions block vacuum — dead tuples can't be removed (still visible somewhere). One forgotten BEGIN — bloat grows.

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

VACUUM FULL

Rewrites entire table compactly. Reclaims disk space.

Caveat. ACCESS EXCLUSIVE lock — entire table locked.

Used когда:

  • Table sigificantly bloated.
  • Maintenance window OK.

Alternative — pg_repack. Online repack без exclusive lock.

pg_repack -t my_table -d my_db

Bloat measurement

SELECT
  relname,
  pg_size_pretty(pg_relation_size(oid)) AS size,
  n_dead_tup,
  n_live_tup,
  round(n_dead_tup::numeric / NULLIF(n_live_tup, 0) * 100, 2) AS dead_ratio
FROM pg_stat_user_tables
WHERE n_dead_tup > 1000
ORDER BY n_dead_tup DESC;

dead_ratio > 20% — bloat issue.

Связанные темы

FAQ

Это официальная информация?

Нет. Статья основана на документации Postgres.


Тренируйте Data Engineering — откройте тренажёр с 1500+ вопросами для собесов.