VACUUM FULL — спасение от bloated-таблиц или тихий враг?

GuDron

dumpz.ws
Admin
Регистрация
28 Янв 2020
Сообщения
9,386
Реакции
1,547
Credits
32,796
VACUUM FULL — спасение от bloated-таблиц или тихий враг?
Сегодня поговорим о том, что многие DBA используют как "универсальную таблетку" — VACUUM FULL. Но стоит ли?

Что делает VACUUM FULL:
Он полностью перебирает таблицу и создаёт её заново, убирая все мёртвые строки. Результат — таблица становится компактной, как после дефрагментации. Это помогает, если у тебя:
- Много UPDATE или DELETE
- Таблица разрослась до абсурдных размеров
- Autovacuum не справляется

Как понять, что таблица bloated:
SQL:
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 в проде?