В сообществе администраторов и разработчиков 1С долгое время доминировало мнение, что Microsoft SQL Server является безальтернативным лидером по производительности для систем на платформе 1С:Предприятие. Однако с выходом специализированных сборок Postgres Pro 1C ситуация начала меняться. Рассмотрим случай, когда в однопоточном тесте (так называемом «тесте Гилева») Postgres Pro обошел MSSQL на операционной системе Windows, и разберем технические причины этого явления, а также подводные камни, с которыми можно столкнуться при эксплуатации.
Проанализируем ситуацию: на процессоре Intel Core i5-11600K с быстрым NVMe-накопителем Samsung 980 Pro СУБД Postgres Pro 14.4 показала результат в 49 «попугаев», в то время как настроенный по рекомендациям ИТС Microsoft SQL Server 2019 выдал лишь 36. Почему это происходит?
Разберем основные причины превосходства Postgres Pro в синтетических тестах:
Postgres Pro 1C содержит оптимизации, разработанные совместно с инженерами «1С». Это касается в первую очередь работы с временными таблицами, которые 1С использует очень интенсивно. В MSSQL создание временных таблиц — операция довольно «дорогая» с точки зрения системных ресурсов tempdb.Выясним роль настроек многопоточности. Для MSSQL стандартной рекомендацией ИТС является установка параметра MAXDOP = 1 (ограничение параллелизма для одного запроса), чтобы избежать блокировок и взаимного влияния запросов в высоконагруженных системах. В Postgres Pro по умолчанию настройки могут позволять планировщику задействовать больше ядер для выполнения операций (например, max_parallel_workers_per_gather).
Однако, как показывает практика, простое изменение MAXDOP в MSSQL редко позволяет догнать Postgres в однопоточном тесте, так как проблема кроется в самой архитектуре обработки запросов 1С. Рассмотрим подробнее, как Postgres работает на Windows: в этой ОС он эмулирует процессы через потоки, что исторически считалось менее эффективным, чем в Linux, но последние версии Postgres Pro нивелировали это отставание для задач 1С.
Важным аспектом при выборе Postgres Pro является его взаимодействие с дисковой подсистемой. Разберем предупреждение о «качестве жизни» SSD. Postgres использует механизм WAL (Write Ahead Logging). При неправильной настройке возникает эффект Write Amplification (усиление записи).
Чтобы ваш NVMe-накопитель не исчерпал ресурс за считанные месяцы, проанализируем следующие параметры в postgresql.conf:
0.9, чтобы «размазать» запись данных на диск и избежать пиковых нагрузок на контроллер SSD.Если в тестах Postgres лидирует, то в реальных тяжелых отчетах пользователи часто жалуются на замедление. Выясним причину: планировщик запросов Postgres гораздо чувствительнее к качеству написания кода 1С, чем MSSQL.
Проанализируем типичные ошибки и способы их решения:
Nested Loop (вложенные циклы), который работает крайне медленно на больших объемах данных.
// Пример оптимизации в 1С
МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Текст = "ВЫБРАТЬ ... ПОМЕСТИТЬ ВТ_Данные ИЗ ... ;
ИНДЕКСИРОВАТЬ ПО ВТ_Данные.ПолеКлюч"; // Критически важно для Postgres!
Запрос.Выполнить();
3. Неявные преобразования типов: Проанализируем ситуацию, когда в условии соединения типов данных 1С (например, СправочникСсылка и Строка) происходит неявное приведение. MSSQL может «простить» это, но Postgres выполнит полное сканирование таблицы (Seq Scan) вместо использования индекса.
Рассмотрим вопрос масштабируемости. Существует мнение, что после 30–50 активных пользователей Postgres начинает уступать MSSQL. Это связано с тем, что в Postgres каждое подключение — это отдельный процесс ОС. При большом количестве сессий затраты на переключение контекста процессора становятся критическими.
Для решения этой проблемы при работе с 1С рекомендуется использовать PGBouncer (пулер соединений). Он позволяет эффективно переиспользовать открытые сессии к базе данных, снижая нагрузку на CPU и память сервера. MSSQL имеет встроенный пул потоков, поэтому он кажется более стабильным «из коробки» при росте числа пользователей.
Подведем итог нашему анализу. Победа Postgres Pro 1C в синтетических тестах на Windows — это не случайность, а результат глубокой оптимизации движка под метаданные 1С. Однако для успешной эксплуатации в «продакшене» необходимо выполнить следующие шаги:
WAL для защиты ресурса SSD.Таким образом, выбор между MSSQL и Postgres Pro сегодня зависит не только от стоимости лицензий, но и от готовности команды разработчиков 1С уделять внимание качеству кода и тонкой настройке окружения.