PostgreSQL для 1С: настройка Autovacuum, VACUUM и ANALYZE
Почему база 1С на PostgreSQL начинает тормозить со временем?
В отличие от MSSQL, архитектура СУБД PostgreSQL использует механизм MVCC (многоверсионность данных). Когда 1С обновляет или удаляет документ, старая запись физически не стирается, а помечается как «мертвая» (dead tuple). Без регулярного обслуживания возникают серьезные проблемы:
- Резкое замедление проведения документов и формирования отчетов;
- Разрастание размера базы данных на диске в 2-4 раза из-за скопления мертвого мусора;
- Планировщик запросов (Query Planner) строит неоптимальные планы выполнения из-за устаревшей статистики
ANALYZE.
Настройка регламентного обслуживания и Autovacuum
Шаг 1. Понимание разницы между VACUUM и ANALYZE
- ANALYZE — собирает статистику о распределении данных в таблицах. Позволяет СУБД выбирать самые быстрые индексы.
- VACUUM — очищает страницы диска от «мертвых» строк, делая место доступным для новых записей 1С.
- VACUUM FULL — физически сжимает таблицы и возвращает место ОС, но намертво блокирует всю базу на время работы (в продакшене используется крайне редко).
Шаг 2. Оптимальные параметры Autovacuum в postgresql.conf
Откройте файл
/etc/postgresql/X.X/main/postgresql.confи настройте автоматический сборщик мусора под специфику 1С:autovacuum = on autovacuum_max_workers = 4 autovacuum_naptime = 20s autovacuum_vacuum_threshold = 50 autovacuum_analyze_threshold = 50 autovacuum_vacuum_scale_factor = 0.05 autovacuum_analyze_scale_factor = 0.02 autovacuum_vacuum_cost_limit = 1000Шаг 3. Ручной ночной скрипт обслуживания через cron
Для высоконагруженных баз 1С рекомендуется запускать ночной скрипт полной переиндексации и сбора статистики по расписанию:
# Добавьте в crontab пользователя postgres: 0 3 * * * vacuumdb -U postgres -d your_1c_db_name --analyze --verbose
Важно: Перезапустите службу PostgreSQL после изменения конфигурационного файла: sudo systemctl restart postgresql.
Частые вопросы (FAQ)
Блокирует ли обычный VACUUM работу пользователей 1С?
Нет. Стандартный фоновый VACUUM и Autovacuum работают параллельно с транзакциями 1С и не блокируют чтение или запись таблиц.
Почему не рекомендуется часто запускать VACUUM FULL?
VACUUM FULL накладывает эксклюзивную блокировку (ExclusiveLock) на всю таблицу. Пользователи 1С получат ошибку превышения времени ожидания блокировки транзакции.
Как проверить, сколько «мертвых» строк накопилось в базе?
Выполните SQL-запрос: SELECT relname, n_dead_tup, n_live_tup FROM pg_stat_user_tables ORDER BY n_dead_tup DESC LIMIT 10;.
Что дает обновление статистики ANALYZE для 1С?
Оно исключает ситуации, когда при проведении документа СУБД ошибочно выбирает полное сканирование всей многомиллионной таблицы (Seq Scan) вместо использования быстрого индекса (Index Scan).