Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Запрос намертво зависает на postgresql

Запрос намертво зависает на postgresql
Я
   edem911
 
22.03.19 - 09:31
Добрый день!

Платформа 8.3.14.1565
Сервер SQL Postgresql 10
Есть запрос с левым соединением по измерению регистра

"ВЫБРАТЬ РАЗРЕШЕННЫЕ
        |    ЕСТЬNULL(КВП_СведенияОПроживающихНаДату.Жилец, КВП_СведенияОПроживающихНаДатуБезОтбора.Жилец) КАК Проживающий,
        |    ЕСТЬNULL(КВП_СведенияОПроживающихНаДату.Жилец.ФизЛицо, КВП_СведенияОПроживающихНаДатуБезОтбора.Жилец.ФизЛицо) КАК ФизЛицо,
        |    ЕСТЬNULL(КВП_СведенияОПроживающихНаДату.ЛицевойСчет, КВП_СведенияОПроживающихНаДатуБезОтбора.ЛицевойСчет) КАК ЛицевойСчет,
        |    ЕСТЬNULL(КВП_СведенияОПроживающихНаДату.ЛицевойСчет.Адрес.Владелец, КВП_СведенияОПроживающихНаДатуБезОтбора.ЛицевойСчет.Адрес.Владелец) КАК Здание,
        |    ЕСТЬNULL(КВП_СведенияОПроживающихНаДату.ЛицевойСчет.Адрес, КВП_СведенияОПроживающихНаДатуБезОтбора.ЛицевойСчет.Адрес) КАК Квартира,
        |    КВП_СведенияОПроживающихНаДату.ДатаИзменения КАК ДатаПрибытия,
        |    ВЫБОР
        |        КОГДА КВП_СведенияОПроживающихНаДату.ДатаИзменения < КВП_СведенияОПроживающихНаДатуБезОтбора.ДатаИзменения
        |            ТОГДА КВП_СведенияОПроживающихНаДатуБезОтбора.ДатаИзменения
        |    КОНЕЦ КАК ДатаВыбытия,
        |    ИСТИНА КАК Проживает
        |ПОМЕСТИТЬ втПроживающих
        |ИЗ
        |    РегистрСведений.УПЖКХ_СведенияОПроживающих.СрезПоследних(
        |            &Период,
        |            Проживает
        |                И ДатаИзменения <= &Период) КАК КВП_СведенияОПроживающихНаДату
        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.УПЖКХ_СведенияОПроживающих.СрезПоследних(&Период, НЕ Проживает) КАК КВП_СведенияОПроживающихНаДатуБезОтбора
        |        ПО (КВП_СведенияОПроживающихНаДатуБезОтбора.Жилец = КВП_СведенияОПроживающихНаДату.Жилец)
        |;"



Запрос наглухо виснет в базе на postgresql.
В файловой формируется за 10 сек
В MS SQL тоже.

postgresql настроен по всем канонам. Поле "Жилец" индексируется.

Разработчики конфигурации уже 2 неделю анализируют базу или говорят, что анализируют(
Помогите, у меня уже варианты закончились.
 
 
   antihacker
 
1 - 22.03.19 - 09:37
А постгри запатчен патчем для 1С ? У меня ничего не зваисает. Давно сижу на постгри. Правда патч на 9,6 верисю. Судя по версии твего постгри он не запатчен
   edem911
 
2 - 22.03.19 - 09:45
(1) А вот об этом я не подумал...
На сайте postgre рекомендуют 9.4.14 и 9.6.5.
Щас попробуем, спасибо за наводку.
   antihacker
 
3 - 22.03.19 - 09:50
Обязательно отпишись.
   cons24
 
4 - 22.03.19 - 10:48
(0) вообще в "типичных причинах неоптимальной работы запросов" на ИТС как раз написано про соединение с виртуальными таблицами.
Так что как вариант - поместить каждую виртуальную во временную, и лишь потом соединять.
   novichok79
 
5 - 22.03.19 - 10:50
(1) на 10-ую патч уже не нужен, насколько я знаю. там сделано через расширение.
   arsik
 
6 - 22.03.19 - 10:54
(5) откуда ставил постгре? Ставь из репозитория postgrespro.ru
   arsik
 
7 - 22.03.19 - 10:56
   unregistered
 
8 - 22.03.19 - 10:58
(0) Перепишите запрос на пакет и ипите мозг.

> Разработчики конфигурации уже 2 неделю анализируют базу или говорят, что анализируют

Они-то как раз ипут вам мозг. Это очевидно.
   unregistered
 
9 - 22.03.19 - 11:01
(0) Для начала можно прост избавиться от ошибок в виде сравнения даты с NULL.
Типа КВП_СведенияОПроживающихНаДату.ДатаИзменения < КВП_СведенияОПроживающихНаДатуБезОтбора.ДатаИзменения.

Вообще вот это поле (ниже) - оно что? Каков его смысл? Что там должно быть, если условие в КОГДА не выполняется? Почему нет ИНАЧЕ?

 |ВЫБОР
 |        КОГДА КВП_СведенияОПроживающихНаДату.ДатаИзменения < КВП_СведенияОПроживающихНаДатуБезОтбора.ДатаИзменения
 |            ТОГДА КВП_СведенияОПроживающихНаДатуБезОтбора.ДатаИзменения
 |    КОНЕЦ КАК ДатаВыбытия
   unregistered
 
10 - 22.03.19 - 11:03
+ к (9) Вообще авторы текста запроса из (0) в курсе что такое правое и левое соединение и чем они отличаются? В тексте явно перепутаны право и лево.
 
 Рекламное место пустует
   unregistered
 
11 - 22.03.19 - 11:03
(8)* "и ипите" читать как "и НЕ ипите"

Извиняюсь.
   edem911
 
12 - 22.03.19 - 11:27
(9) Да сам отчет в конкретном случае я переписал. Но проблема в том что в типовом решении они используют такой отбор проживающих везде где нужно получить таблицу проживающих, там не правильная логика еще и самого регистра. И в самом первом обращении к разработчикам я указывал конкретно на этот кривой запрос, а они еще чето анализируют. Просто переписывать пол конфы из-за "крутых" разработчиков.
Кстати запрос вывел информацию спустя 57 596 сек, в файловой базе выводит за 18 сек.
   Провинциальный 1сник
 
13 - 22.03.19 - 11:28
Моё любимое "enable_nestloop=off" в очередной раз
   edem911
 
14 - 22.03.19 - 11:36
(13) включал выключал - без результата, делал индексацию, чистил мусор.
   Йохохо
 
15 - 22.03.19 - 11:47
ВЫБРАТЬ РАЗРЕШЕННЫЕ X СрезПоследних Х КВП_СведенияОПроживающихНаДату.ЛицевойСчет.Адрес.Владелец 
вам самим то не жалко его?
   edem911
 
16 - 22.03.19 - 11:53
(9) Спасибо и за эту наводку
Кстати оптимизированный запрос, выводиться за 8 сек)))
ВЫБРАТЬ
    УПЖКХ_СведенияОПроживающихСрезПоследних.Жилец КАК Жилец,
    УПЖКХ_СведенияОПроживающихСрезПоследних.Жилец.ФизЛицо КАК ЖилецФизЛицо,
    УПЖКХ_СведенияОПроживающихСрезПоследних.ЛицевойСчет КАК ЛицевойСчет,
    УПЖКХ_СведенияОПроживающихСрезПоследних.ЛицевойСчет.Адрес.Владелец КАК ЛицевойСчетАдресВладелец,
    УПЖКХ_СведенияОПроживающихСрезПоследних.ЛицевойСчет.Адрес КАК ЛицевойСчетАдрес,
    УПЖКХ_СведенияОПроживающихСрезПоследних.ДатаИзменения КАК ДатаИзменения
ПОМЕСТИТЬ СОтбором
ИЗ
    РегистрСведений.УПЖКХ_СведенияОПроживающих.СрезПоследних(
            &Период,
            Проживает
                И ДатаИзменения <= &Период) КАК УПЖКХ_СведенияОПроживающихСрезПоследних
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    УПЖКХ_СведенияОПроживающихСрезПоследних.Жилец КАК Жилец,
    УПЖКХ_СведенияОПроживающихСрезПоследних.Жилец.ФизЛицо КАК ЖилецФизЛицо,
    УПЖКХ_СведенияОПроживающихСрезПоследних.ЛицевойСчет КАК ЛицевойСчет,
    УПЖКХ_СведенияОПроживающихСрезПоследних.ЛицевойСчет.Адрес.Владелец КАК ЛицевойСчетАдресВладелец,
    УПЖКХ_СведенияОПроживающихСрезПоследних.ЛицевойСчет.Адрес КАК ЛицевойСчетАдрес,
    УПЖКХ_СведенияОПроживающихСрезПоследних.ДатаИзменения КАК ДатаИзменения
ПОМЕСТИТЬ БезОтбора
ИЗ
    РегистрСведений.УПЖКХ_СведенияОПроживающих.СрезПоследних(&Период, НЕ Проживает) КАК УПЖКХ_СведенияОПроживающихСрезПоследних
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ЕСТЬNULL(СОтбором.Жилец, БезОтбора.Жилец) КАК Проживающий,
    ЕСТЬNULL(СОтбором.Жилец.ФизЛицо, БезОтбора.Жилец.ФизЛицо) КАК ФизЛицо,
    ЕСТЬNULL(СОтбором.ЛицевойСчет, БезОтбора.ЛицевойСчет) КАК ЛицевойСчет,
    ЕСТЬNULL(СОтбором.ЛицевойСчет.Адрес.Владелец, БезОтбора.ЛицевойСчет.Адрес.Владелец) КАК Здание,
    ЕСТЬNULL(СОтбором.ЛицевойСчет.Адрес, БезОтбора.ЛицевойСчет.Адрес) КАК Квартира,
    СОтбором.ДатаИзменения КАК ДатаПрибытия,
    ВЫБОР
        КОГДА СОтбором.ДатаИзменения < БезОтбора.ДатаИзменения
            ТОГДА БезОтбора.ДатаИзменения
    КОНЕЦ КАК ДатаВыбытия,
    ИСТИНА КАК Проживает
ИЗ
    СОтбором КАК СОтбором
        ЛЕВОЕ СОЕДИНЕНИЕ БезОтбора КАК БезОтбора
        ПО (БезОтбора.Жилец = СОтбором.Жилец)

   edem911
 
17 - 22.03.19 - 11:55
А вот так за 6 сек.
ВЫБРАТЬ
    УПЖКХ_СведенияОПроживающихСрезПоследних.Жилец КАК Жилец,
    УПЖКХ_СведенияОПроживающихСрезПоследних.Жилец.ФизЛицо КАК ЖилецФизЛицо,
    УПЖКХ_СведенияОПроживающихСрезПоследних.ЛицевойСчет КАК ЛицевойСчет,
    УПЖКХ_СведенияОПроживающихСрезПоследних.ЛицевойСчет.Адрес.Владелец КАК ЛицевойСчетАдресВладелец,
    УПЖКХ_СведенияОПроживающихСрезПоследних.ЛицевойСчет.Адрес КАК ЛицевойСчетАдрес,
    УПЖКХ_СведенияОПроживающихСрезПоследних.ДатаИзменения КАК ДатаИзменения
ПОМЕСТИТЬ СОтбором
ИЗ
    РегистрСведений.УПЖКХ_СведенияОПроживающих.СрезПоследних(
            &Период,
            Проживает
                И ДатаИзменения <= &Период) КАК УПЖКХ_СведенияОПроживающихСрезПоследних
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    УПЖКХ_СведенияОПроживающихСрезПоследних.Жилец КАК Жилец,
    УПЖКХ_СведенияОПроживающихСрезПоследних.Жилец.ФизЛицо КАК ЖилецФизЛицо,
    УПЖКХ_СведенияОПроживающихСрезПоследних.ЛицевойСчет КАК ЛицевойСчет,
    УПЖКХ_СведенияОПроживающихСрезПоследних.ЛицевойСчет.Адрес.Владелец КАК ЛицевойСчетАдресВладелец,
    УПЖКХ_СведенияОПроживающихСрезПоследних.ЛицевойСчет.Адрес КАК ЛицевойСчетАдрес,
    УПЖКХ_СведенияОПроживающихСрезПоследних.ДатаИзменения КАК ДатаИзменения
ПОМЕСТИТЬ БезОтбора
ИЗ
    РегистрСведений.УПЖКХ_СведенияОПроживающих.СрезПоследних(&Период, НЕ Проживает) КАК УПЖКХ_СведенияОПроживающихСрезПоследних
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ЕСТЬNULL(СОтбором.Жилец, БезОтбора.Жилец) КАК Проживающий,
    ЕСТЬNULL(СОтбором.Жилец.ФизЛицо, БезОтбора.Жилец.ФизЛицо) КАК ФизЛицо,
    ЕСТЬNULL(СОтбором.ЛицевойСчет, БезОтбора.ЛицевойСчет) КАК ЛицевойСчет,
    ЕСТЬNULL(СОтбором.ЛицевойСчет.Адрес.Владелец, БезОтбора.ЛицевойСчет.Адрес.Владелец) КАК Здание,
    ЕСТЬNULL(СОтбором.ЛицевойСчет.Адрес, БезОтбора.ЛицевойСчет.Адрес) КАК Квартира,
    СОтбором.ДатаИзменения КАК ДатаПрибытия,
    ВЫБОР
        КОГДА СОтбором.ДатаИзменения < БезОтбора.ДатаИзменения
            ТОГДА БезОтбора.ДатаИзменения
        ИНАЧЕ ДАТАВРЕМЯ(1, 1, 1, 1, 1, 1)
    КОНЕЦ КАК ДатаВыбытия,
    ИСТИНА КАК Проживает
ИЗ
    СОтбором КАК СОтбором
        ЛЕВОЕ СОЕДИНЕНИЕ БезОтбора КАК БезОтбора
        ПО БезОтбора.Жилец = СОтбором.Жилец

   Йохохо
 
18 - 22.03.19 - 12:30
что мешает использовать вместо ЕСТЬNULL(СОтбором.ЛицевойСчет.Адрес.Владелец, БезОтбора.ЛицевойСчет.Адрес.Владелец) КАК Здание ЕСТЬNULL(СОтбором.ЛицевойСчетАдресВладелец, БезОтбора.ЛицевойСчетАдресВладелец) КАК Здание ?????
   Йохохо
 
19 - 22.03.19 - 12:31
еще и на левое
   edem911
 
20 - 22.03.19 - 12:50
(18) ничего, здесь просто были заменены таблицы регистров на временные, итоговый запрос не менялся
   Йохохо
 
21 - 22.03.19 - 12:51
(20) не понимаете да?
   edem911
 
22 - 22.03.19 - 12:57
(21) понимаю, я так и переделал, изначально это место сформировалось конструктором при замене таблицы регистра на временную
   Йохохо
 
23 - 22.03.19 - 12:59
разработчикам вашим не показывайте, а то они будут к вам относиться как вы к ним
   edem911
 
24 - 22.03.19 - 13:04
В итоге имеем время вывода 3 сек.
Всем спасибо!)
ВЫБРАТЬ
    УПЖКХ_СведенияОПроживающихСрезПоследних.Жилец КАК Жилец,
    УПЖКХ_СведенияОПроживающихСрезПоследних.Жилец.ФизЛицо КАК ЖилецФизЛицо,
    УПЖКХ_СведенияОПроживающихСрезПоследних.ЛицевойСчет КАК ЛицевойСчет,
    УПЖКХ_СведенияОПроживающихСрезПоследних.ЛицевойСчет.Адрес.Владелец КАК ЛицевойСчетАдресВладелец,
    УПЖКХ_СведенияОПроживающихСрезПоследних.ЛицевойСчет.Адрес КАК ЛицевойСчетАдрес,
    ЕСТЬNULL(УПЖКХ_СведенияОПроживающихСрезПоследних.ДатаИзменения, ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)) КАК ДатаИзменения
ПОМЕСТИТЬ СОтбором
ИЗ
    РегистрСведений.УПЖКХ_СведенияОПроживающих.СрезПоследних(
            &Период,
            Проживает
                И ДатаИзменения <= &Период) КАК УПЖКХ_СведенияОПроживающихСрезПоследних
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    УПЖКХ_СведенияОПроживающихСрезПоследних.Жилец КАК Жилец,
    УПЖКХ_СведенияОПроживающихСрезПоследних.Жилец.ФизЛицо КАК ЖилецФизЛицо,
    УПЖКХ_СведенияОПроживающихСрезПоследних.ЛицевойСчет КАК ЛицевойСчет,
    УПЖКХ_СведенияОПроживающихСрезПоследних.ЛицевойСчет.Адрес.Владелец КАК ЛицевойСчетАдресВладелец,
    УПЖКХ_СведенияОПроживающихСрезПоследних.ЛицевойСчет.Адрес КАК ЛицевойСчетАдрес,
    ЕСТЬNULL(УПЖКХ_СведенияОПроживающихСрезПоследних.ДатаИзменения, ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)) КАК ДатаИзменения
ПОМЕСТИТЬ БезОтбора
ИЗ
    РегистрСведений.УПЖКХ_СведенияОПроживающих.СрезПоследних(&Период, НЕ Проживает) КАК УПЖКХ_СведенияОПроживающихСрезПоследних
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ЕСТЬNULL(СОтбором.Жилец, БезОтбора.Жилец) КАК Проживающий,
    ЕСТЬNULL(СОтбором.ЖилецФизЛицо, БезОтбора.ЖилецФизЛицо) КАК ФизЛицо,
    ЕСТЬNULL(СОтбором.ЛицевойСчет, БезОтбора.ЛицевойСчет) КАК ЛицевойСчет,
    ЕСТЬNULL(СОтбором.ЛицевойСчетАдресВладелец, БезОтбора.ЛицевойСчетАдресВладелец) КАК Здание,
    ЕСТЬNULL(СОтбором.ЛицевойСчетАдрес, БезОтбора.ЛицевойСчетАдрес) КАК Квартира,
    СОтбором.ДатаИзменения КАК ДатаПрибытия,
    ВЫБОР
        КОГДА СОтбором.ДатаИзменения < БезОтбора.ДатаИзменения
            ТОГДА БезОтбора.ДатаИзменения
        ИНАЧЕ ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
    КОНЕЦ КАК ДатаВыбытия,
    ИСТИНА КАК Проживает
ПОМЕСТИТЬ втПроживающих
ИЗ
    СОтбором КАК СОтбором
        ЛЕВОЕ СОЕДИНЕНИЕ БезОтбора КАК БезОтбора
        ПО (БезОтбора.Жилец = СОтбором.Жилец)
;


   Йохохо
 
25 - 22.03.19 - 13:09
осталось с нул порешать, есть он или кушать
   edem911
 
26 - 22.03.19 - 18:15
В итоге больше всего нравиться ответ разработчиков.
Выглядело это примерно так:

07.03-Я- У нас не формируется отчет, проблема в запросе вот в этом месте.
07.03-Р-У нас все работает на релизе "таком то", обновите конфигурацию
07.03-Я- релиза "такого -то" нет на оф. сайте
07.03-Р- это тестовый релиз, вот вам ссылка
07.03-Я- Обновили проблема сохранилась
11.03-Р- Дайте копию базы
11.03-Я- Вот ссылка
12.03-Я- Есть результат?
12.03-Р- база анализируется
13.03-Я- есть результат?
14.03-Р- данные анализируются
15.03-Я- есть результат?
15.03-Р- база тестируется
19.03-Я- Есть результат?Сроки?
20.03-Р- тестируется сроки назвать не можем
22.03-Я- Мы решили проблему своими силами
22.03-Р- Вчера вопрос был передан в отдел разработки на рассмотрение
22.03-Я(В шоке)- а что вы делали до этого?
22.03-Р- до этого момента проблема анализировалась линией консультации. Как будет ответ мы вам сообщим.

Занавес.
   Провинциальный 1сник
 
27 - 24.03.19 - 19:56
(26) В среднем две недели приходится бодаться с линией консультаций, чтобы они наконец-то признали ошибку ошибкой и передали на рассмотрение разработчиком. Это норма для 1с.
   palsergeich
 
28 - 24.03.19 - 21:22
(26) Купите корпоративную поддержку и к Вашим проблемам будут относиться уважительнее (С)
   stopa85
 
29 - 25.03.19 - 08:30
(24) Еще бы сравнить это оптимизированый код, с файловой и MS SQL.
   unregistered
 
30 - 25.03.19 - 08:41
(29) В этом, думаю, особого смысла нет. Результат сравнения больше будет зависеть не от конкретной СУБД, а от различных прочих условий (общий размер данных, размер данных попадающих в отбор и пр.).
В особенности если верить автору ветки в (12): "там не правильная логика еще и самого регистра". И судя по самому запросу, я склонен с ним согласиться.
   edem911
 
31 - 25.03.19 - 09:33
(29) в среднем, во всех вариантах, время выполнения 3-5 сек.
   sqr4
 
32 - 25.03.19 - 09:57
(12) если это та конфа о которой я думаю, то там в регистре накопления УПЖКХ_Начисления - есть измерение Количество, я так и не разобрался зачем)
   edem911
 
33 - 25.03.19 - 12:38
(32) да-да есть такое) использование нигде не встречается, может код в защищенных обработках)
 
 
   sqr4
 
34 - 25.03.19 - 12:45
(33) Ну пару раз при написании собственных квитанций, я натыкался на то что количество сворачивалось, а не суммировалось. И каждый раз с криком на весь отдел "Количество же измерение" задача решалась.
А так да, в старых релизах в зашифрованных модулях.


Список тем форума
Рекламное место пустует  Рекламное место пустует
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух.
Фредерик Брукс-младший
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует