Настройка PostgresSQL для оптимальной работы с 1С.
В сети есть куча рекомендаций по настройке СУБД PostgresSQL для работы с решениями 1С, но какого-то полного общего мануала для 14-ой версии ваш покорный слуга не нашел. Решил написать свой. Ниже описаны изменения файла при которых Postgres довольно бодро работает с базами 1С.
Первые пять пунктов взяты с сайта PostgresPro (ссылка)
1. 1С может создавать большое количество соединений, не все из которых имеют смысл. Поэтому увеличиваем максимально возможное число одновременных подключений к серверу баз данных до 500-1000.
max_connections = 1000
2. Настройки временных таблиц.
Обычно решения 1C используют множество временных таблиц. Такие таблицы в большом количестве используются каждым обслуживающим процессом. Закрывая соединение, Postgres пытается удалить все временные таблицы в одной транзакции, при этом транзакция может запрашивать множество блокировок. Если число блокировок превысит значение max_locks_per_transaction, транзакция прервётся и оставит за собой множество потерянных временных таблиц.
Увеличиваем размер буфера для временных таблиц:
temp_buffers = 32MB
Увеличиваем число допустимых в одной транзакции блокировок таблиц или индексов до 256:
max_locks_per_transaction = 256
3. Включаем экранирование символом обратной косой черты для всех строк и выключить предупреждение об использовании этого символа:
standard_conforming_strings = off
escape_string_warning = off
4. Эффективность оптимизатора запросов Postgres зависит от выделенного ему объёма ОЗУ, поэтому параметр effective_cache_size равным минимум половине объёма ОЗУ, доступного в системе.
effective_cache_size = <Половина ОЗУ>
5. Оптимизируем планирование запросов с помощью расширения plantuner.
Добавляем plantuner в переменную shared_preload_libraries:
shared_preload_libraries = 'plantuner'
Настраиваем оптимизатор Postgres для улучшенного планирования запросов с недавно созданными пустыми таблицами:
plantuner.fix_empty_table = 'on'
6. Отключаем использование планировщиком планов соединений с вложенными циклами. По умолчанию эта опция включена, что приводит к зависаниям динамических списков с большим количеством записей.
enable_nestloop = off
7. Отключаем полную запись страниц. Тут спорный вопрос: отключение полной записи страниц ускоряет работу, но может привести к повреждению базы данных в случае системного сбоя или отключения питания. На хабре есть перевод подробной статьи по этому вопросу (ссылка).
full_page_writes = off
8. Настраиваем параллельное выполнение запросов. Для оптимальной работы на многоядерных процессорах меняем параметры max_worker_processes и max_parallel_workers на количество логический процессоров (потоков), а параметры max_parallel_workers_per_gather и max_parallel_maintenance_workers на 4 если потоков больше 6.
max_worker_processes = <кол-во потоков CPU>
max_parallel_workers_per_gather = 4
max_parallel_workers = <кол-во потоков CPU>
max_parallel_maintenance_workers = 4