PostgreSQLПродвинутый
VACUUM / AUTOVACUUM
Очищает «мёртвые» версии строк после UPDATE и DELETE. Необходим для корректной работы PostgreSQL.
Синтаксис
VACUUM table_name;
VACUUM ANALYZE table_name;
VACUUM FULL table_name; -- осторожно! блокирует таблицуОбъяснение
PostgreSQL использует MVCC: UPDATE не удаляет старую строку, а создаёт новую версию. DELETE только помечает строку как удалённую. Физически они остаются — «мёртвые версии».
VACUUM убирает мёртвые версии, освобождает место, обновляет статистику. AUTOVACUUM делает это автоматически.
VACUUM ANALYZE — дополнительно обновляет статистику для оптимизатора.
Пример
-- Проверить таблицы с большим количеством мёртвых строк
SELECT relname, n_dead_tup, n_live_tup,
last_autovacuum
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC;Связанные термины
Анекдоты по теме
— Что такое index bloat? — Индекс «раздувается» со временем из-за мёртвых версий строк. — Как проверить? — pgstattuple расширение: SELECT * FROM pgstatindex('idx_name'); — Как исправить? — REINDEX CONCURRENTLY idx_name; — перестраивает без блокировки. — VACUUM не помогает? — Помогает частично. Тяжёлый bloat — REINDEX.
— Что такое DEADLOCK? — Это когда транзакция А ждёт транзакцию Б, а транзакция Б ждёт транзакцию А. — И что происходит? — База выбирает жертву и убивает одну из них. — Жестоко. — Зато честно.
Программист написал DELETE без WHERE. Через секунду он уже писал резюме.