К статье
Практический материал

Администрирование · 12 мин

Как увеличить производительность PostgreSQL для 1С

Практическое руководство по ускорению PostgreSQL для 1С: настройка памяти, autovacuum, индексы, плановые задания и диагностика медленных запросов.

PostgreSQL — самая распространённая бесплатная СУБД для работы 1С:Предприятие, но «из коробки» она настроена на минимальное потребление ресурсов, а не на скорость. Параметры по умолчанию рассчитаны на слабый сервер с 1–2 ГБ оперативной памяти, поэтому без настройки база 1С на PostgreSQL почти всегда работает медленнее своих возможностей. Правильная конфигурация памяти, фоновых процессов и регулярное обслуживание способны ускорить типовые операции в разы без замены железа.

Проблемы производительности в связке 1С + PostgreSQL обычно сводятся к нескольким причинам: недостаточный объём памяти под кэш, неоптимальные настройки планировщика запросов, раздувание таблиц из-за неагрессивного autovacuum и «тяжёлые» запросы, которые генерирует конфигурация. Важно понимать, что 1С формирует SQL-запросы автоматически, и влиять на них администратор может только косвенно — через настройки СУБД, индексы и регламентные операции.

Перед любыми изменениями снимите полную резервную копию базы штатными средствами (pg_dump или выгрузка через конфигуратор) и убедитесь, что копия восстанавливается. Настройки применяйте поэтапно, фиксируя исходные значения, чтобы при ухудшении можно было быстро откатиться.

Диагностика: что именно тормозит

Прежде чем менять параметры, определите источник проблемы. Медленная работа 1С может быть вызвана сетью, дисковой подсистемой, нехваткой ОЗУ, блокировками или конкретными запросами. Начните с простых наблюдений: загрузка CPU и диска на сервере СУБД в момент «тормозов», объём свободной памяти, скорость отклика диска.

Подключите расширение pg_stat_statements — оно собирает статистику по всем выполняемым запросам: сколько раз вызывался запрос, суммарное и среднее время. Это главный инструмент поиска «тяжёлых» запросов в 1С.

sql
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
SELECT round(total_exec_time::numeric, 2) AS total_ms, calls, round(mean_exec_time::numeric, 2) AS avg_ms, query
FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT 20;

Дополнительно проверьте размер базы и самых больших таблиц — в 1С это обычно регистры накопления, сведений и таблицы итогов. Раздутая таблица с устаревшими версиями строк (dead tuples) — частая причина деградации скорости даже при хорошем железе.

Высокий CPU на сервере СУБДЗапросы работают без подходящих индексов или планировщик выбирает плохой план

Топ запросов в pg_stat_statements по времени

Высокая нагрузка на дискМало памяти под кэш либо идёт интенсивная запись WAL

shared_buffers, effective_cache_size, тип дисков

Много dead tuples в таблицахAutovacuum не успевает очищать версии строк

pg_stat_user_tables, колонки n_dead_tup и last_autovacuum

Долгие ожидания блокировокКонкуренция транзакций или длинные транзакции в 1С

pg_locks и pg_stat_activity в момент проблемы

Настройка памяти: shared_buffers, work_mem, effective_cache_size

Ключевой параметр — shared_buffers: объём памяти, который PostgreSQL выделяет под собственный кэш данных. Для выделенного сервера 1С обычно рекомендуют 25–30% от общего объёма ОЗУ. На сервере с 32 ГБ это 8–10 ГБ. Сильно больше выделять не стоит: PostgreSQL активно использует и файловый кэш операционной системы.

Параметр effective_cache_size не выделяет память, а подсказывает планировщику, сколько данных примерно доступно в кэше ОС. Ставьте его на уровне 50–70% от объёма ОЗУ — это влияет на выбор планов запросов в пользу индексного доступа вместо полного сканирования.

Параметр work_mem определяет память на одну операцию сортировки или хэширования. Для 1С, где запросы часто содержат соединения множества таблиц, разумное значение — 64–256 МБ. Учтите: один сложный запрос может использовать work_mem несколько раз, а одновременных соединений много, поэтому не завышайте значение — иначе сервер уйдёт в подкачку.

ini
# postgresql.conf для сервера с 32 ГБ ОЗУ
shared_buffers = 8GB
effective_cache_size = 20GB
work_mem = 128MB
maintenance_work_mem = 2GB
max_connections = 200

После изменения shared_buffers требуется перезапуск службы PostgreSQL, поэтому планируйте работы на нерабочее время. Изменение work_mem и effective_cache_size применяется перезагрузкой конфигурации без остановки сервера.

Autovacuum и борьба с раздуванием таблиц

PostgreSQL не удаляет старые версии строк сразу — их убирает фоновый процесс autovacuum. В базах 1С с интенсивной записью (проведение документов, обмены данными) стандартные настройки autovacuum слишком «ленивые»: таблицы раздуваются, запросы начинают читать в разы больше страниц, чем нужно, и производительность падает постепенно, незаметно для пользователей.

Для нагруженных баз 1С рекомендуется сделать autovacuum агрессивнее: увеличить количество воркеров, снизить пороги срабатывания и уменьшить задержки между проходами. Одновременно поднимите maintenance_work_mem — это ускорит VACUUM и создание индексов.

ini
autovacuum = on
autovacuum_max_workers = 4
autovacuum_naptime = 20s
autovacuum_vacuum_scale_factor = 0.05
autovacuum_analyze_scale_factor = 0.02
autovacuum_vacuum_cost_delay = 10ms

Контролируйте результат через представление pg_stat_user_tables: смотрите колонки n_dead_tup (число «мёртвых» строк) и last_autovacuum. Если dead tuples исчисляются миллионами, а autovacuum давно не запускался — таблице требуется вмешательство. Для критичных таблиц, уже сильно раздутых, однократно выполните VACUUM FULL в нерабочее время (учтите: он блокирует таблицу на всё время работы).

Регламентные операции: обновление статистики и реиндексация

Планировщик PostgreSQL выбирает план запроса на основе статистики о распределении данных. Если статистика устарела (а в 1С данные меняются постоянно), оптимизатор начинает выбирать неоптимальные планы: полное сканирование вместо индекса, неверный порядок соединений. Характерный симптом — запрос, который «вчера работал быстро, а сегодня висит».

Настройте регулярное выполнение ANALYZE по всей базе — обычно достаточно раза в день в нерабочее время, а для очень активных баз — чаще. Автоанализ, включённый вместе с autovacuum, часто справляется сам, но ручной запуск после массовых загрузок данных (обмены, загрузка прайсов, свёртка) обязателен.

Реиндексация нужна реже: индексы в PostgreSQL со временем деградируют из-за удалений и обновлений. Для большинства баз 1С достаточно REINDEX раз в неделю или раз в месяц в окно обслуживания. Используйте REINDEX CONCURRENTLY, если нужно избежать полной блокировки (доступно не для всех объектов и работает медленнее).

Регламент обслуживания базы 1С
  1. 1
    Ежедневно в нерабочее время: ANALYZE по всей базе
  2. 2
    Еженедельно: REINDEX базы или наиболее нагруженных таблиц
  3. 3
    Еженедельно: проверка pg_stat_user_tables на раздувание таблиц
  4. 4
    Ежемесячно: анализ топа запросов pg_stat_statements
  5. 5
    После массовых загрузок и обменов: внеочередной ANALYZE
  6. 6
    Перед каждым регламентом: контроль наличия свежей резервной копии

Оптимизация со стороны 1С и конфигурации

Часть «тормозов» лежит не в СУБД, а в том, как конфигурация работает с данными. Проверьте настройки управляемых блокировок: для PostgreSQL в большинстве случаев рекомендуется режим управляемых блокировок вместо автоматических — он снижает число взаимоблокировок и ложных конфликтов при параллельной работе пользователей.

Обратите внимание на итоги регистров: убедитесь, что хранение итогов включено и актуально, а устаревшие периоды закрыты. Отчёты по регистрам с отключенными или «разваленными» итогами выполняются полным сканированием и грузят сервер. Также проверьте журналы регистрации — при детальном уровне логирования они растут быстро и замедляют обслуживание.

Для нестандартных доработок используйте технологический журнал 1С совместно с данными pg_stat_statements: так можно связать конкретную операцию в конфигурации с SQL-запросом и понять, где проблема — в коде, индексе или плане. Изменения запросов в коде конфигурации (уменьшение выборок, отказ от запросов в цикле) часто дают больший эффект, чем любая настройка СУБД.

Типичные ошибки
01
Выставление work_mem в гигабайты «про запас» — при росте числа соединений сервер уходит в своп, и всё встаёт
02
Отключение autovacuum ради «стабильности» — таблицы раздуваются, и через месяцы база деградирует
03
Применение чужих конфигов без пересчёта под свой объём ОЗУ и нагрузку
04
Реиндексация и VACUUM FULL в рабочее время — массовые ошибки блокировок у пользователей
05
Настройка СУБД без резервной копии и без фиксации исходных значений параметров
06
Игнорирование дисковой подсистемы: база на медленных HDD не ускорится никакими параметрами

Железо и размещение данных

Никакая настройка не компенсирует медленные диски. Для баз 1С критична задержка при случайном чтении и скорость записи журнала WAL, поэтому SSD (лучше NVMe) — фактически обязательное требование для рабочих баз среднего и крупного размера. Размещение каталога pg_wal на отдельном быстром диске снижает конкуренцию за дисковые ресурсы при интенсивной записи.

По процессору PostgreSQL выигрывает от высокой тактовой частоты сильнее, чем от большого числа медленных ядер: один запрос выполняется в основном одним потоком. Для сервера 1С это значит, что 8 быстрых ядер предпочтительнее 16 медленных. Память берите с запасом: ОС, сервер 1С (rphost) и PostgreSQL конкурируют за ОЗУ, если размещены на одной машине.

Варианты размещения

Всё на одном сервере (СУБД + сервер 1С)

Подходит для баз до ~50 ГБ и небольшого числа пользователей; минус — конкуренция за память и CPU

Отдельный сервер СУБД

Рекомендуется для средних и крупных баз; требует быстрой сети между серверами (не ниже 1 Гбит/с, лучше 10)

Виртуальная машина под PostgreSQL

Допустимо, но требует честного резервирования CPU и дисков; оверселлинг ресурсов гипервизором — частая скрытая причина тормозов

Как проверить, что настройки сработали

Измеряйте эффект до и после изменений. Зафиксируйте время выполнения характерных операций: проведение крупного документа, формирование ключевого отчёта, закрытие месяца. После применения настроек повторите замеры в сопоставимых условиях — только так можно объективно оценить результат.

В самой СУБД контролируйте долю попаданий в кэш (hit ratio) по pg_stat_database: для «прогретой» рабочей базы нормальным считается значение около 99% и выше. Низкий показатель означает, что данные не помещаются в кэш и PostgreSQL постоянно читает с диска — стоит пересмотреть shared_buffers или объём ОЗУ.

Контрольные точки

Как проверить результат

Время типовых операций (проведение, отчёты)
Норма

Сократилось или стабилизировалось при той же нагрузке

Тревожный признак

Не изменилось или выросло — откатить последнее изменение

Кэш-хит pg_stat_database (blks_hit / (blks_hit + blks_read))
Норма

Около 99% и выше на прогретой базе

Тревожный признак

Заметно ниже — данные не помещаются в кэш

Dead tuples в pg_stat_user_tables
Норма

Небольшие значения, autovacuum запускается регулярно

Тревожный признак

Миллионы мёртвых строк, autovacuum давно не работал

Дисковая очередь и latency на сервере
Норма

Низкие задержки в пике нагрузки

Тревожный признак

Рост очереди — узкое место в дисках, настройки не помогут

FAQ

Какие параметры PostgreSQL менять в первую очередь для 1С?

Начните с shared_buffers (25–30% ОЗУ), effective_cache_size (50–70% ОЗУ), work_mem (64–256 МБ) и maintenance_work_mem. Эти четыре параметра дают основной эффект и безопасны при разумных значениях. Затем настройте autovacuum и включите pg_stat_statements для дальнейшей диагностики.

Нужна ли специальная сборка PostgreSQL для 1С?

Да, для работы 1С:Предприятие требуется сборка PostgreSQL с патчами от 1С (или совместимая, например PostgresPro для 1С). Ванильная версия с postgresql.org не подходит из-за особенностей работы с типами данных и сортировкой. Брать сборку следует с портала поставщика вашей лицензии 1С.

Как часто делать реиндексацию базы 1С?

Для большинства баз достаточно раза в неделю или месяц в нерабочее время. Чаще имеет смысл только при очень интенсивной записи и удалении данных. Ориентируйтесь на фактическое раздувание индексов, а не на календарь: если производительность стабильна, интервал можно увеличить.

Почему запрос в 1С вчера работал быстро, а сегодня «висит»?

Чаще всего причина в устаревшей статистике планировщика: после массовых изменений данных PostgreSQL выбирает неверный план. Выполните ANALYZE по проблемным таблицам — в большинстве случаев это решает проблему. Если нет, смотрите план запроса через EXPLAIN ANALYZE и проверяйте наличие подходящих индексов.

Можно ли ускорить базу 1С без покупки нового железа?

Да, если узкое место — в конфигурации СУБД: настройка памяти, autovacuum, реиндексация и обновление статистики часто ускоряют базу в разы. Но если сервер упирается в медленные HDD или нехватку ОЗУ, программные меры дадут ограниченный эффект, и апгрейд железа станет единственным решением.

Опасно ли менять настройки PostgreSQL на боевой базе?

Небезопасно без подготовки. Обязательно сделайте резервную копию, зафиксируйте исходные значения параметров и меняйте настройки по одной, проверяя эффект. Операции VACUUM FULL и REINDEX выполняйте только в нерабочее время — они блокируют таблицы и прерывают работу пользователей.

Итог

Что важно запомнить

Производительность PostgreSQL для 1С строится на трёх опорных точках: правильно выделенная память, агрессивный autovacuum с регулярным обслуживанием и постоянная диагностика через pg_stat_statements. Меняйте параметры поэтапно, измеряйте эффект и всегда держите актуальную резервную копию.