VACUUM ANALYZE
Тема дорожной карты · PostgreSQL
VACUUM ANALYZE — комбинированная команда обслуживания PostgreSQL, которая сначала выполняет VACUUM для освобождения пространства, занятого мёртвыми кортежами, и предотвращения переполнения идентификаторов транзакций, а затем запускает ANALYZE для сбора обновлённой статистики таблиц, используемой планировщиком запросов при оптимизации стоимости. Регулярное выполнение VACUUM ANALYZE — фундаментальная задача администрирования баз данных, поскольку устаревшая статистика заставляет планировщик выбирать неоптимальные планы выполнения — например, предпочитать последовательное сканирование индексному для больших таблиц. Демон autovacuum автоматически выполняет VACUUM ANALYZE для таблиц, пересекающих пороги, определяемые параметрами autovacuum_vacuum_scale_factor и autovacuum_analyze_scale_factor, однако ручной VACUUM ANALYZE часто необходим после массовой загрузки данных, крупных удалений или изменений схемы для немедленного обновления статистики по критически важным таблицам. Команда VACUUM ANALYZE может быть направлена на конкретные таблицы или схемы (VACUUM ANALYZE schema.table) и принимает параметры управления уровнем детализации вывода (VERBOSE) для отображения счётчиков мёртвых кортежей и статистики страниц в процессе выполнения. Поддержание актуальной статистики с помощью VACUUM ANALYZE — одна из наиболее надёжных практик настройки производительности при администрировании баз данных PostgreSQL.
Как это работает
VACUUM ANALYZE — цена MVCC. UPDATE и DELETE не удаляют строки — помечают dead; VACUUM возвращает место, ANALYZE обновляет статистику планировщика, REINDEX перестраивает раздутые индексы. autovacuum работает непрерывно по дефолту, но его триггеры консервативны для больших таблиц — тюньте autovacuum_vacuum_scale_factor, autovacuum_analyze_scale_factor per-table. VACUUM FULL переписывает таблицу (лочит записи!); pg_repack делает online. Смотрите pg_stat_user_tables.n_dead_tup для bloat.
Когда применять
Тюньте autovacuum агрессивно на горячих таблицах (например autovacuum_vacuum_scale_factor = 0.01 для миллион-строчных). Мониторьте bloat через pgstattuple или pgstatindex из pg_repack. pg_repack еженедельно на самых больших таблицах. Всегда ANALYZE после большой загрузки/миграции — старая статистика даёт плохие планы. Никогда VACUUM FULL под трафиком — лочит всю таблицу.
Типичные ошибки
Ловушки VACUUM ANALYZE: игнор autovacuum до 100GB таблицы с 50GB dead-строк; transaction wraparound — миф 200-летней давности, реальный (SELECT datname, age(datfrozenxid) FROM pg_database); неконтролируемый index bloat (запросы медленнее со временем при том же row count); VACUUM FULL в пик (CEO позвонит). Мониторьте + alerts на bloat-метрики с первого дня.