Имя: Пароль:
1C
1С v8
v8: Пациент жалуется не то на постгрес, не то на 1С
,
0 ask76
 
15.04.13
11:22
Исходные:
Платформа 8.2.17.153, Конфигурация УПП 1.3.31.1
Сервер 1С:Предприятие на CentOS 5.9 x86
Сервер SQL Postgresql 9.1 на CentOS 5.9 x64

Используется RLS по организациям.

Проблема:
Трансляция запроса

ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 2
   ДоговорыКонтрагентов.Ссылка КАК Договор
ИЗ
   Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
ГДЕ
   (НЕ ДоговорыКонтрагентов.ПометкаУдаления)    И ДоговорыКонтрагентов.Организация = &ПарОрганизация
   И ДоговорыКонтрагентов.Владелец    = &ПарКонтрагент
   И (ВЫБОР КОГДА ДоговорыКонтрагентов.Владелец.ОсновнойДоговорКонтрагента.Организация = &ПарОрганизация
            ТОГДА ДоговорыКонтрагентов.Ссылка  = ДоговорыКонтрагентов.Владелец.ОсновнойДоговорКонтрагента
            ИНАЧЕ ДоговорыКонтрагентов.Ссылка <> ДоговорыКонтрагентов.Владелец.ОсновнойДоговорКонтрагента КОНЕЦ)

из процедуры ПолучитьДоступныеДоговорыКонтрагента из общего модуля ЗаполнениеДокументов в запрос postgresql приводит к запросу вида

ВЫБРАТЬ ПЕРВЫЕ 2
   Договоры1.Ссылка
ИЗ
   Справочники.ДоговорыКонтрагентов КАК Договоры1
       ЛЕВОЕ СОЕДИНЕНИЕ Справочники.Контрагенты КАК Контрагенты2
       ПО Договоры1.Владелец = Контрагенты2.Ссылка
       ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           Договоры4.Ссылка КАК Ссылка,
           Договоры4.Организация КАК Организация
       ИЗ
           Справочники.ДоговорыКонтрагентов КАК Договоры4) КАК Договоры3
       ПО (Контрагенты2.ОсновнойДоговорКонтрагента = Договоры3.Ссылка)

я убрал здесь все условия, оставив только джойны и переименовал таблицы/поля в соответствии с представлением 1С. Можно видеть что у второго джойна неправильное условие соединение, благодаря которому на базе с таблицей договоров порядка 11000 записей запрос отрабатывает несколько секунд, за счет, фактически, декартового произведения таблиц. План запроса можно посмотреть здесь:
http://explain.depesz.com/s/BxC

Вопрос: в каком месте происходит неправильный парсинг запроса - на сервере 1С:Предприятие или сам postgres уже тупит?
1 cw014
 
15.04.13
11:24
Скажи на милось, зачем тебе ЭТО???
2 ask76
 
15.04.13
11:27
ой... заголовок-то и забыл написать. Я криво сформулировал вопрос?
3 Лефмихалыч
 
15.04.13
11:29
(2)  ты вообще его не сформулировал
4 sikuda
 
15.04.13
11:30
Ну сколько можно говорить: 1C практически ничего не сделала, чтобы Postgrasql у нее заработал нормально. Сделали для галочки в листовке + бесплатная sql...
5 ask76
 
15.04.13
11:32
Попробую переформулировать. По логам postgres я вижу, что запрос на языке 1С неправильно парсится в запрос на языке postgres. Вопрос: кто виноват, сервер предприятия 1С или сам postgres? Точнее, кто из них обрабатывает слово "РАЗРЕШЕННЫЕ" в запросе?
6 Fragster
 
гуру
15.04.13
11:34
вот нафига????
ДоговорыКонтрагентов.Владелец.ОсновнойДоговорКонтрагента.Организация
7 ask76
 
15.04.13
11:38
(6) Это я хз. Такой вот запрос.
8 ansh15
 
15.04.13
15:27
(5) Думается, что PostgreSQL  в принципе не понимает слово РАЗРЕШЕННЫЕ, поэтому, наверное, 1С выступает в качестве транслятора.
Несколько секунд, это неприемлемо много? Исправят со временем...
9 Fragster
 
гуру
15.04.13
15:28
а все дело не в кривых шаблонах и кривом запросе?
10 ask76
 
15.04.13
15:51
(8) Нет, неприемлемо, к сожалению. Этот запрос вызывается при подборе основного договора при выборе контрагента в счете на оплату. Если после этого попытаться сменить договор, то система виснет уже на полторы-две минуты, т.к. там уже десять соединений. Клиент может и не дождаться.  

(9) Это все типовое, под полными правами нормально работает и на pgsql и на mssql. А под обычным юзером, с ограничением по организации, - mssql нормально отрабатывает, pgsql тупит.   База здоровая и времени на перебор всех вариантов просто нет. Поэтому хотелось бы экспериментировать более-менее осознанно.
11 ansh15
 
15.04.13
16:52
(10) Попробуйте в качестве эксперимента поиграться параметрами в секции "Planner Method Configuration" postgresql.conf,
enable_nestloop = off или enable_mergejoin = off, например,
оптимизатор будет тогда пытаться найти другой путь построения запроса, может поможет.
12 eses
 
15.04.13
16:57
Мой совет : не используй postgres , это как joomla или как ненастроенный линукс или как литовская иномарка в россии
13 eses
 
15.04.13
16:58
как вообще с БД можно играться, должно работать как часы, а тут : сделай это, сделай то - может быть поможет
14 Hmster
 
15.04.13
16:59
тебе дело сказали про
ДоговорыКонтрагентов.Владелец.ОсновнойДоговорКонтрагента.Организация
попробуй нормально переписать запрос
15 Fragster
 
гуру
15.04.13
16:59
(13) т.е. то, что надо намазывать РЛС на 3-е вложенное левое соединение - не смущает? я про ДоговорыКонтрагентов.Владелец.ОсновнойДоговорКонтрагента.Организация
16 MaxisUssr
 
15.04.13
17:05
(0)
А какой запрос Postgre генерит?
Заметил, что Postgre обличает кривые запросы (по крайней мере мои - обличал не раз, доставил тысячи мучений, после переписки запросов, которые на Sql летали бы - все становилось ОК).
17 andreynikus
 
15.04.13
19:23
(0) Стандартная ошибка в запросе - соединение с подзапросом.
Перепиши с использованием временных таблиц и возможно этого будет достаточно.
Ну или ПОНЯТЬ зачем нужен этот запрос, какую задачу он решает и переписать его по нормальному
18 andreynikus
 
15.04.13
19:29
(10) Обычное дело когда mssql нормально обрабатывает сложные запросы, т.к. его оптимизатор любой кривой запрос старается вытянуть, но это конечно не освобождает от правильного написания запросов.
При это многие другие субд в том числе pgsql и oracle не заморачиваются со сложными запросами и выбирают для них жуткие планы исполнения.
19 ask76
 
17.04.13
08:25
В общем проблема решилась откатом postgresql с 9.1 на 8.3.8 - запросы postgres генерит действительно разные и в восьмой версии их нормально отрабатывает. Таким образом, postgresql 9.1 и RLS - вещи не совместимые на данный момент.
20 ask76
 
17.04.13
08:27
(17) Совет был бы полезен, если б это была самописная конфигурация, но мы работаем с типовой УПП и переписывать каждый запрос, где в типовом коде присутствует слово "РАЗРЕШЕННЫЕ" - нет, я к этому не готов.
21 ask76
 
17.04.13
08:30
(16) запрос здесь - http://pastebin.com/G7E5STxq
22 Fragster
 
гуру
17.04.13
08:33
ну так оно 4 раза РЛС присоединяет
23 Sammo
 
17.04.13
08:53
(20) Тогда расслабтесь и получайте удовольствие.
24 andreynikus
 
17.04.13
18:25
(20) Разработчики УПП к сожалению тоже совершают ошибки
Возможно в новой версии эти запросы поправят, хотя наверняка наделают новых :)
Если лень исправлять тогда конечно (20)