При работе с конфигурацией «Управление торговым предприятием для Украины» (УТП) на связке с PostgreSQL системные администраторы и разработчики часто сталкиваются с проблемой: стандартный отчет Сведения об ОС намертво «вешает» систему. При этом на MS SQL Server тот же самый отчет с той же базой данных отрабатывает корректно и быстро. В данной статье мы подробно разберем, почему возникает эта деградация производительности, как оперативно «оживить» отчет и какие настройки СУБД помогут избежать подобных проблем в будущем.
Рассмотрим ситуацию: при запуске отчета планировщик PostgreSQL получает сложный запрос, генерируемый платформой 1С. Этот запрос обычно включает в себя множество соединений с виртуальными таблицами остатков, регистрами сведений и справочниками. Основная причина «зависания» заключается в том, что планировщик PostgreSQL ошибочно выбирает неэффективную стратегию выполнения запроса.
Проанализируем основные факторы, влияющие на такое поведение:
Nested Loop (вложенные циклы), который при реальном объеме данных начинает выполняться бесконечно долго.Как показала практика обсуждения на форуме, самым быстрым способом заставить отчет работать является изменение параметра enable_nestloop. Выясним, как это сделать и к чему это приведет.
Попробуем временно отключить использование вложенных циклов в конфигурационном файле postgresql.conf или непосредственно для сессии. Это заставит СУБД использовать более подходящие для больших объемов данных методы Hash Join или Merge Join.
Для этого в файле настроек установим:
# В файле postgresql.conf
enable_nestloop = off
Важно: Это решение является «костылем». Отключение enable_nestloop на глобальном уровне может замедлить работу других, более простых запросов, где вложенные циклы были бы эффективны. Однако для тяжелых отчетов в старых версиях УТП это зачастую единственный способ получить результат.
Чтобы не просто «заткнуть дыру», а системно решить проблему производительности, разберем по шагам правильную настройку сервера.
Шаг 1. Оптимизация под SSD.
Если ваша база данных размещена на SSD-накопителях (как в рассматриваемом примере с SSD 240GB), стандартные настройки PostgreSQL будут работать против вас. Параметр random_page_cost по умолчанию равен 4.0, что рассчитано на медленные HDD. Это заставляет СУБД избегать использования индексов.
Установим более подходящее значение:
random_page_cost = 1.1
Шаг 2. Настройка лимитов планировщика.
Запросы 1С строятся динамически и часто содержат огромное количество соединений. Рассмотрим параметры from_collapse_limit и join_collapse_limit. Если они слишком малы, планировщик не сможет оптимизировать запрос целиком. Рекомендуется поднять их до 20:
from_collapse_limit = 20
join_collapse_limit = 20
Шаг 3. Обновление статистики (ANALYZE).
После внесения изменений в конфигурацию или после массовой загрузки данных обязательно нужно выполнить процедуру сбора статистики. Выполните в консоли запросов (или через pgAdmin) команду:
ANALYZE;
Это обновит данные о распределении значений в таблицах, что поможет планировщику принимать более взвешенные решения.
Проанализируем технические подробности окружения. В теме упоминается платформа 8.3.10.2561. Это достаточно старая версия. Платформа 1С выступает «транслятором» между языком запросов 1С и SQL. В более современных версиях (8.3.15 и выше) механизмы генерации SQL-кода специально для PostgreSQL были значительно улучшены.
Если есть возможность, выполним следующие действия:
ГДЕ вместо параметров виртуальной таблицы в 1С приводит к тому, что PostgreSQL вычитывает всю таблицу целиком (Seq Scan) вместо использования индекса.Когда запрос становится экстремально сложным (более 11-12 таблиц), PostgreSQL включает Генетический оптимизатор запросов (GEQO). Он работает быстрее классического перебора, но результат часто оказывается непредсказуемым. Если отчет «Сведения об ОС» продолжает виснуть, попробуем увеличить порог включения GEQO:
geqo_threshold = 15
Рассмотрим краткий чек-лист для приведения системы в рабочее состояние:
postgresql.conf. Убеждаемся, что effective_cache_size составляет примерно 75% от доступной оперативной памяти (в нашем случае это около 12GB).random_page_cost = 1.1.enable_nestloop = off и проверяем работу отчета. Если это помогло — причина в планировщике.autovacuum_analyze_scale_factor = 0.01.ANALYZE базы данных.Таким образом, проблема «зависания» отчета Сведения об ОС в УТП на PostgreSQL чаще всего не является ошибкой самого отчета, а является следствием неудачного выбора плана выполнения запроса. Сочетание тонкой настройки параметров планировщика и поддержание актуальной статистики позволяет добиться стабильной работы системы, сопоставимой по скорости с MS SQL Server.