Имя: Пароль:
1C
 
PostgreSQL и ядра CPU
0 Накомото
 
13.02.24
07:24
Погуглил, ответы то есть, но читая их окончательно запутался :) Ранее с PostgreSQL никогда не работал я.

Есть 1с + PostgreSQL и нормальный многоядерный проц на сервере. При некоторых операциях (например, закрытие месяца в БП) создаётся огромный запрос, при выполнении которого PostgreSQL жрёт только одно ядро CPU на сервере. Как я понял (могу ошибаться) PostgreSQL может жрать 2 ядра если выполняет 2 запроса одновременно. Но PostgreSQL не может как бы "разбить" один большой запрос и выполнять его на двух ядрах или более.

А вот Microsoft SQL якобы так может и делает это.

Вообще на сервере 16 ядер. Контора переехала недавно с Microsoft SQL на PostgreSQL, после чего со слов пользователей 1с стало "дико тормозной". Попытки оптимизировать PostgreSQL принимал местный админ, не помогло. Теперь хотят переехать обратно на Windows и Microsoft SQL.

Вот главный вопрос в котором я запутался: действительно ли Microsoft SQL разбивает один запрос так, что выполняет его на нескольких ядрах параллельно, а PostgreSQL так не умеет? Именно один запрос, а не несколько.

Просто если это верно, тогда однозначно надо переезжать на Microsoft SQL.

Заранее отвечу какого хрена тогда они переехали: как я понял хотели сэкономить на лицензии.
1 Krendel
 
13.02.24
07:48
(0) У нас был случай, заказчик "настроил" сервак в 2 раза медленнее чем из "коробки", даже на хабре по высокопроизводительные сервера писал статейки и как настраивать ;-))))
2 Chai Nic
 
13.02.24
08:04
(0) "действительно ли Microsoft SQL разбивает один запрос так, что выполняет его на нескольких ядрах параллельно, а PostgreSQL так не умеет"
Да, разбиваает. Но это не рекомендуют включать для 1с, потому что при этом возможны взаимоблокировки и вылеты приложения по таймауту.

"переехала недавно с Microsoft SQL на PostgreSQL, после чего со слов пользователей 1с стало "дико тормозной""
Это известное проклятие постгреса под названием "nested loop join", которое особенно сильно проявляется именно в 1с, поскольку там можно легко и просто соединить две подзапроса, даже не понимая этого, а постгрес рассуждает так "я не знаю статистику соединяемых таблиц, значит они маленькие и их надо соединять вложенными циклами". В типовых в основном это пооптимизировали, но возможно что не везде.
3 Chai Nic
 
13.02.24
08:07
А чтобы постгрес не жрал проц, есть простой способ, прописать "enable_nestloop=off", тогда он будет больше жрать диск и временные таблицы)
4 Накомото
 
13.02.24
08:14
(2) Спасибо
5 Xapac
 
13.02.24
08:18
(0) Postgres умеет параллельно выполнять запросы.
вот вам документация:
https://postgrespro.ru/docs/postgresql/15/parallel-query
6 Xapac
 
13.02.24
08:20
ну и вообще в ютубе есть замечательные курсы по postgres от компании postgresPro БЕСПЛАТНЫЕ. Посмотрите хотя-бы их перед тем, как внедрять слонов
7 Накомото
 
13.02.24
08:21
(5) Возможно вы не поняли мой вопрос. Мой вопрос в том может ли PostgreSQL распарралелить выполнение именно одного-единственного запроса (большого), а не несколько запросов. Как я понял из статей: PostgreSQL так не умеет, а Microsoft SQL так умеет. Я не уверен что верно понимаю.
8 Chai Nic
 
13.02.24
09:25
(7) enable_nestloop=off для начала попробуйте, может этого хватит вам
9 Волшебник
 
13.02.24
09:26
(7) пишется "распараллелить"
10 Накомото
 
13.02.24
10:27
(9) ок, учту
11 Накомото
 
13.02.24
10:27
(8) Спасибо. Уже попробовали - не помогло. Пробовал не я, а местный админ, он в этом больше понимает. Говорит не помогло вообще. Но попробовать явно стоило, тоже натыкался на такую рекомендацию когда гуглил.
12 1Снеговик
 
13.02.24
11:02
(0) В общем случае мы рекомендуем устанавливать значение параметра max degree of parallelism равным 1, то есть запрещать Database Engine параллельное выполнение запросов.
https://its.1c.ru/db/metod8dev/content/5945/hdoc
13 arsik
 
13.02.24
11:14
Вот же https://habr.com/ru/companies/slurm/articles/446706/
Настройте конфиг, что бы он только очень тяжелые запросы параллелил.
14 Lama12
 
13.02.24
11:40
(12) Это в общем случае. Что в MS SQL, что в Postgre есть параметр отвечающий за стоимости операции распараллеливания. Параметр сложный в настройке, но если с ним поиграться, то можно получить плюсы от распараллеливания. Причем серьезные.
15 XMMS
 
13.02.24
12:23
(14)Интересно, спасибо. Обычно не заморачивались и следовали рекомендации, но интересно будет покопать в эту сторону. Может видели какие-то статьи на эту тему?
16 Garykom
 
13.02.24
13:06
>переехала недавно с Microsoft SQL на PostgreSQL, после чего со слов пользователей 1с стало "дико тормозной".

имхо настройки PGSQL кривые
17 Garykom
 
13.02.24
13:06
причем дело не в параллелизме скорее всего
18 eklmn
 
13.02.24
13:17
В PostgreSQL 10 параллельная обработка включена по умолчанию
19 Lama12
 
13.02.24
14:21
(15) Общих рекомендаций по данному параметру быть не может, т.к. его настройка сильно зависит от природы нагрузки на базу и архитектуру базы.
Для себя нашел такой вариант (не уверен что оптимальный).
На копии базы отключаю параллелизм. Прогоняю ТиИ базы с контролем времени.
Включаю параллелизм.  Прогоняю ТиИ базы с контролем времени.
Поскольку ТиИ очень хорошо распараллеливается, то время будет разным.
Дальше включаю распараллеливание и ставлю низкую стоимость распараллеливания. Опять ТиИ с замером времени. Последовательно повторяю ТиИ с некоторым увеличением стоимости распараллеливания. Как только время проведения ТиИ заметно увеличивается, уменьшаю стоимость на предыдущее значение. Обычно подобная настройка дает прирост производительности при работе подсистемы бюджетирования в УПП и в ERP.
Получается что на простых запросах система не включает распараллеливание, а на сложных включает.