Таблица разрослась до десятков гигабайт, но данных в ней на пару гигов после массовых DELETE? VACUUM FULL перепишет таблицу и вернёт место на диск. Но есть нюансы.
🔹 Зачем это нужно
— PostgreSQL при DELETE не освобождает место на диске, а помечает строки как мёртвые.
— Обычный VACUUM чистит мёртвые строки для переиспользования, но файл не уменьшает.
— VACUUM FULL физически переписывает таблицу, реально освобождает место.
🔹 Как использовать
— Проверить «раздутие»:
SELECT pg_size_pretty(pg_total_relation_size('my_table'));— Мёртвые строки:
SELECT n_dead_tup, n_live_tup FROM pg_stat_user_tables WHERE relname = 'my_table';— Обычный VACUUM:
VACUUM VERBOSE my_table; (не блокирует таблицу)— Полная перезапись:
VACUUM FULL my_table; (⚠️ блокирует таблицу полностью!)— Обновить статистику:
ANALYZE my_table;💡 VACUUM FULL берёт эксклюзивный лок — таблица полностью недоступна. На проде используйте pg_repack, он делает то же самое, но без блокировки. Ставится как расширение: CREATE EXTENSION pg_repack;
🐸 Библиотека пхпшника