Сегодня хочу поговорить о том, что многие DBA используют как "универсальную таблетку" —
VACUUM FULL. Но стоит ли?💡 Что делает VACUUM FULL:
Он полностью перебирает таблицу и создаёт её заново, убирая все мёртвые строки. Результат — таблица становится компактной, как после дефрагментации. Это помогает, если у тебя:
- Много
UPDATE или DELETE- Таблица разрослась до абсурдных размеров
- Autovacuum не справляется
🔎 Как понять, что таблица bloated:
SELECT
schemaname, relname,
pg_size_pretty(pg_total_relation_size(relid)) AS total_size,
pg_size_pretty(pg_relation_size(relid)) AS table_size,
(pg_total_relation_size(relid) - pg_relation_size(relid)) AS index_overhead
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC;
Если
table_size сильно больше, чем объём живых данных — у тебя блоат.⚠️ Осторожно: VACUUM FULL = эксклюзивная блокировка!
Пока он работает:
- Все запросы к таблице ждут
- Могут “залипать” аппы
- В проде без окон — 💥
🛠 Что делать вместо:
- Пробовать
pg_repack — он делает примерно то же, но без блокировок- Делать регулярный
autovacuum + мониторинг- Разбивать массивные UPDATE/DELETE на батчи
VACUUM FULL — это инструмент, который стоит использовать осознанно. Как хирургический скальпель — мощный, но не для каждодневного применения. А ты когда последний раз делал
VACUUM FULL в проде? 😏#db
👉 @database_info