Вопрос выбора системы управления базами данных (СУБД) для 1С исторически сопровождался мифами о нестабильности и медлительности PostgreSQL по сравнению с MS SQL Server. Однако с развитием платформы 1С:Предприятие 8.3 и выходом новых версий «Слона» (PostgreSQL) ситуация кардинально изменилась. Проанализируем, в каких случаях переход оправдан, с какими техническими трудностями придется столкнуться и как правильно подготовить инфраструктуру.
Рассмотрим текущее состояние дел. Начиная с версии платформы 8.3.13 и PostgreSQL 10, поддержка СУБД вышла на новый уровень. Современный PostgreSQL умеет эффективно распараллеливать запросы, что раньше было главным преимуществом MS SQL. Выясним, почему многие эксперты рекомендуют использовать не «ванильную» сборку, а специализированные решения, такие как Postgres Pro или сборки от самой компании 1С.
Специализированные сборки содержат критически важные патчи для 1С:
Разберем опасения автора темы по поводу «сложных запросов». В PostgreSQL действительно есть особенности, которые могут замедлить работу самописных конфигураций, если код не оптимизирован под требования этой СУБД. Проанализируем основные зоны риска:
1. Полные соединения (FULL JOIN): PostgreSQL крайне не любит ПОЛНОЕ СОЕДИНЕНИЕ. Если в MS SQL такие запросы проходят относительно безболезненно, то на Postgres они могут вызвать колоссальную нагрузку. Рекомендуем заменять их на объединение результатов (UNION ALL) левых и правых соединений, если это возможно.
2. Виртуальные таблицы в соединениях: Рассмотрим классическую проблему — соединение с виртуальной таблицей СрезПоследних. В старых версиях это приводило к деградации производительности. В современных версиях (PostgreSQL 12+) и при использовании актуальных релизов платформы 1С проблема во многом нивелирована, но «лучшей практикой» остается предварительная выгрузка данных из виртуальных таблиц во временные таблицы перед соединением.
3. Механизм блокировок: Современная 1С работает в режиме управляемых блокировок. Это означает, что логика блокировок перенесена на уровень сервера приложений 1С. В этом режиме PostgreSQL работает практически идентично MS SQL, так как конфликты на уровне СУБД сводятся к минимуму. Однако, если ваша база все еще использует «Автоматический режим блокировок», PostgreSQL может блокировать таблицы целиком там, где MS SQL заблокировал бы только диапазон строк.
Проанализируем ситуацию с выбором ОС. Опыт администраторов однозначно говорит: PostgreSQL нельзя эксплуатировать под Windows для серьезных нагрузок. Рассмотрим причины:
fork (процессы), которая в Windows эмулируется через потоки, что работает медленнее.Если вы планируете переход, закладывайте в бюджет развертывание на Linux (например, Ubuntu, CentOS или Astra Linux).
Выясним причину, по которой «тяжелые» типовые конфигурации (ERP, Комплексная автоматизация) иногда тормозят на PostgreSQL. Главный виновник — RLS (Row Level Security). При включении ограничений доступа 1С дописывает к каждому запросу огромные куски кода с проверками прав. PostgreSQL сложнее переваривает такие монструозные конструкции, чем MS SQL.
Однако в последних версиях Библиотеки стандартных подсистем (БСП 3.0 и выше) механизм RLS был принципиально переработан. Рассмотрим, как это работает: теперь вместо динамического формирования сложных условий используются заранее рассчитанные таблицы прав (ключи доступа). Это значительно упрощает жизнь оптимизатору PostgreSQL. Если ваша конфигурация современная — проблем с RLS будет на порядок меньше.
Переход на PostgreSQL требует изменения подходов к обслуживанию. Посмотрим на основные регламентные операции:
postgresql.conf настроен на минимальное потребление ресурсов. Его нужно обязательно тюнить под ваше железо (параметры shared_buffers, work_mem, effective_cache_size и другие).REINDEX обязателен, в то время как в MS SQL чаще обходятся дефрагментацией.autovacuum должен быть настроен агрессивно, чтобы база не «пухла» при массовых перепроведениях документов.Проанализируем ситуацию, когда запрос написан «под MS SQL» и может вызвать проблемы на PostgreSQL. Рассмотрим фрагмент кода:
// Неоптимально для PostgreSQL: соединение с вложенным запросом
Запрос.Текст = "ВЫБРАТЬ
| Товары.Ссылка,
| ВложенныйЗапрос.Остаток
|ИЗ
| Справочник.Номенклатура КАК Товары
|ЛЕВОЕ СОЕДИНЕНИЕ (
| ВЫБРАТЬ Номенклатура, СуммаОстаток КАК Остаток
| ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки
|) КАК ВложенныйЗапрос ПО Товары.Ссылка = ВложенныйЗапрос.Номенклатура";
Для оптимизации работы на PostgreSQL рекомендуется сначала поместить данные из виртуальной таблицы во временную таблицу, проиндексировать её, и только потом выполнять соединение. Это гарантирует, что оптимизатор выберет правильный тип соединения (например, Hash Join или Merge Join).
Подведем итог. PostgreSQL можно и нужно выбирать вместо MS SQL, если:
Переход не будет «1:1» в плане администрирования — PostgreSQL требует более тонкой ручной настройки. Но с точки зрения конечного пользователя, при правильной настройке на Linux-сервере, разница в производительности будет практически незаметна.