🐘 PostgreSQL: Почему база растет, если я удаляю данные?
Классика: вы удалили миллион строк из таблицы, а место на диске не освободилось. Добро пожаловать в мир MVCC (Multi-Version Concurrency Control).
В Postgres при удалении (DELETE) строка не стирается физически. Она помечается как «мертвая» (dead tuple). Но место всё ещё занято.
❌ Ошибка джуна: Запустить VACUUM FULL. Это освободит место, НО заблокирует таблицу намертво (Access Exclusive Lock). Ваш прод встанет.
✅ Путь Архитектора:
Настройте Autovacuum. Он должен работать агрессивнее, чтобы «мертвецы» не накапливались.
Используйте pg_repack (или pg_squeeze). Это расширение позволяет пересобрать таблицу и вернуть место ОС без блокировок чтения/записи.
Шпаргалка по проверке "вздутия" (Bloat): Вам не нужны сложные скрипты, поставьте pg-bloat-check или используйте запрос:
Если bloat_ratio > 0.2 (20%) — пора звать автовакуум.
#postgresql #database #dba #performance #sql
Классика: вы удалили миллион строк из таблицы, а место на диске не освободилось. Добро пожаловать в мир MVCC (Multi-Version Concurrency Control).
В Postgres при удалении (DELETE) строка не стирается физически. Она помечается как «мертвая» (dead tuple). Но место всё ещё занято.
❌ Ошибка джуна: Запустить VACUUM FULL. Это освободит место, НО заблокирует таблицу намертво (Access Exclusive Lock). Ваш прод встанет.
✅ Путь Архитектора:
Настройте Autovacuum. Он должен работать агрессивнее, чтобы «мертвецы» не накапливались.
Используйте pg_repack (или pg_squeeze). Это расширение позволяет пересобрать таблицу и вернуть место ОС без блокировок чтения/записи.
Шпаргалка по проверке "вздутия" (Bloat): Вам не нужны сложные скрипты, поставьте pg-bloat-check или используйте запрос:
SELECT schemaname, relname, n_dead_tup, n_live_tup,
(n_dead_tup::float / n_live_tup::float) as bloat_ratio
FROM pg_stat_user_tables
WHERE n_dead_tup > 0;
Если bloat_ratio > 0.2 (20%) — пора звать автовакуум.
#postgresql #database #dba #performance #sql