Что такое команда VACUUM в PostgreSQL?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
VACUUM — это утилита в PostgreSQL, которая выполняет очистку "мертвых" кортежей (строк), оставшихся после операций UPDATE и DELETE.
Когда в PostgreSQL происходит UPDATE или DELETE, старая версия строки не удаляется физически сразу же. Вместо этого она помечается как "мертвая". Это связано с реализацией многоверсионного контроля конкурентности (MVCC), позволяющего разным сессиям видеть разные версии данных.
Мертвые кортежи занимают место на диске и могут снижать производительность запросов, поскольку при сканировании таблиц приходится обрабатывать больше данных.
VACUUM выполняет следующие действия:
- Освобождение места: Помечает пространство, занимаемое мертвыми кортежами, как доступное для повторного использования для новых строк.
- Обновление статистики: Может обновить статистику распределения данных, что важно для оптимизатора запросов.
- Предотвращение переполнения счетчиков: Предотвращает переполнение 32-битного счетчика транзакций (
xid wraps) при использованииVACUUM FREEZE.
Существуют два основных типа VACUUM:
-
VACUUM(оптимистичный): Освобождает место, которое затем может быть повторно использовано внутри того же файла данных. Он не сокращает размер файла данных таблицы на диске.-- Простой вызов VACUUM VACUUM имя_таблицы; -- Вызов VACUUM для всех таблиц в текущей базе данных VACUUM; -- VACUUM с обновлением статистики, но без блокировки таблицы VACUUM ANALYZE имя_таблицы; -
VACUUM FULL(пессимистичный): Перезаписывает всю таблицу в новый файл, полностью удаляя мертвые кортежи. Это освобождает место на диске и может уменьшить размер файла данных. ОднакоVACUUM FULLтребует эксклюзивной блокировки таблицы, что означает, что другие операции с таблицей (чтение/запись) будут заблокированы на время выполнения команды. Это делает его менее подходящим для частого использования на работающих системах.-- Вызов VACUUM FULL VACUUM FULL имя_таблицы;
Для большинства систем рекомендуется использовать VACUUM или VACUUM ANALYZE регулярно (часто автоматизированно с помощью автовакуума), а VACUUM FULL использовать только в исключительных случаях, когда необходимо гарантированно освободить дисковое пространство и допустима блокировка таблицы.
Режим автовакуума (autovacuum) в PostgreSQL по умолчанию включен и автоматически запускает процессы VACUUM и ANALYZE для таблиц, активность в которых превышает определенные пороги. Это значительно упрощает управление очисткой и статистикой.