Имя: Пароль:
1C
 
Почему может долго выполняться запрос
0 Momus
 
06.09.23
16:40
Кусок из типовой конфы. Запрос выполняется бесконечно долго, хотя таблица ВТФильтрДля - пустая
ВЫБРАТЬ
    ДатыПолученияДанныхПоИсточникамДанных.ОбщийГрафик КАК ОбщийГрафик,
    ПодневныеДанныеУчетаВремени.Дата КАК Дата,
    МИНИМУМ(ВЫБОР
            КОГДА ПодневныеДанныеУчетаВремени.ДополнительноеЗначение = 0
                ТОГДА ЛОЖЬ
            ИНАЧЕ ИСТИНА
        КОНЕЦ) КАК ВремяВЧасах,
    МИНИМУМ(ВЫБОР
            КОГДА ПодневныеДанныеУчетаВремени.ВидУчетаВремени = &Выходной
                ТОГДА ИСТИНА
            ИНАЧЕ ЛОЖЬ
        КОНЕЦ) КАК ЭтоВыходнойДень,
    МАКСИМУМ(ПодневныеДанныеУчетаВремени.ВЦеломЗаПериод) КАК ВЦеломЗаПериод,
    ДатыПолученияДанныхПоИсточникамДанных.ИсточникДанныхФактическогоВремени КАК ИсточникДанныхФактическогоВремени,
    ДатыПолученияДанныхПоИсточникамДанных.ПериодРегистрацииФактическогоВремени КАК ПериодРегистрацииФактическогоВремени,
    ДатыПолученияДанныхПоИсточникамДанных.Месяц КАК Месяц,
    ДатыПолученияДанныхПоИсточникамДанных.ДатаНачала КАК ДатаНачала,
    ДатыПолученияДанныхПоИсточникамДанных.ДатаОкончания КАК ДатаОкончания,
    ДатыПолученияДанныхПоИсточникамДанных.КлючНабораВидовВремени КАК КлючНабораВидовВремени
ИЗ
    ВТФильтрДля КАК ДатыПолученияДанныхПоИсточникамДанных
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГрафикиРаботыСотрудников КАК ГрафикиРаботыСотрудников
        ПО (ГрафикиРаботыСотрудников.Ссылка = ДатыПолученияДанныхПоИсточникамДанных.ОбщийГрафик)
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПланВидовРасчета.Начисления.ВидыВремени КАК ТаблицаНаборовВидовВремени
        ПО (ТаблицаНаборовВидовВремени.Ссылка = ДатыПолученияДанныхПоИсточникамДанных.КлючНабораВидовВремени)
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГрафикиРаботыПоВидамВремени КАК ПодневныеДанныеУчетаВремени
        ПО (ПодневныеДанныеУчетаВремени.ГрафикРаботы = ДатыПолученияДанныхПоИсточникамДанных.ИсточникДанныхФактическогоВремени)
            И (ПодневныеДанныеУчетаВремени.ПериодРегистрации = ДатыПолученияДанныхПоИсточникамДанных.ПериодРегистрацииФактическогоВремени)
            И (ПодневныеДанныеУчетаВремени.Месяц = ДатыПолученияДанныхПоИсточникамДанных.Месяц)
            И (ПодневныеДанныеУчетаВремени.ВидУчетаВремени = ТаблицаНаборовВидовВремени.ВидВремени)
            И (ПодневныеДанныеУчетаВремени.Дата МЕЖДУ ДатыПолученияДанныхПоИсточникамДанных.ДатаНачала И ДатыПолученияДанныхПоИсточникамДанных.ДатаОкончания)
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря
        ПО (ГрафикиРаботыСотрудников.ПроизводственныйКалендарь = ДанныеПроизводственногоКалендаря.ПроизводственныйКалендарь)
            И (ВЫБОР
                КОГДА ПодневныеДанныеУчетаВремени.ПереходящаяЧастьТекущейСмены
                    ТОГДА ДОБАВИТЬКДАТЕ(ПодневныеДанныеУчетаВремени.Дата, ДЕНЬ, 1)
                ИНАЧЕ ПодневныеДанныеУчетаВремени.Дата
            КОНЕЦ = ДанныеПроизводственногоКалендаря.Дата)
            И (ДанныеПроизводственногоКалендаря.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Праздник))
            И (ТаблицаНаборовВидовВремени.ОпределяющийЗаПраздничныеДни)
ГДЕ
    (НЕ ТаблицаНаборовВидовВремени.ОпределяющийЗаПраздничныеДни
            ИЛИ НЕ ДанныеПроизводственногоКалендаря.Дата ЕСТЬ NULL)

СГРУППИРОВАТЬ ПО
    ДатыПолученияДанныхПоИсточникамДанных.ИсточникДанныхФактическогоВремени,
    ДатыПолученияДанныхПоИсточникамДанных.ПериодРегистрацииФактическогоВремени,
    ДатыПолученияДанныхПоИсточникамДанных.ОбщийГрафик,
    ДатыПолученияДанныхПоИсточникамДанных.Месяц,
    ДатыПолученияДанныхПоИсточникамДанных.ДатаНачала,
    ДатыПолученияДанныхПоИсточникамДанных.ДатаОкончания,
    ДатыПолученияДанныхПоИсточникамДанных.КлючНабораВидовВремени,
    ПодневныеДанныеУчетаВремени.Дата

УПОРЯДОЧИТЬ ПО
    ИсточникДанныхФактическогоВремени,
    ПериодРегистрацииФактическогоВремени,
    Месяц,
    ДатаНачала,
    ДатаОкончания,
    КлючНабораВидовВремени,
    Дата
;
1 Momus
 
06.09.23
16:46
Если исключить ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеПроизводственногоКалендаря, то выполняется "всего лишь" две минуты. Результат запроса естественно пустой
2 Momus
 
06.09.23
16:57
Вообще проблема возникла после обновления ERP на 2.5.12.102: перестал открываться документ "Резервы по оплате труда. Не открывается из-за запроса выше.
3 azernot
 
06.09.23
17:00
(0) Поместите результат всех внутренних соединений в ВТ, а потом уже с этой ВТ произведите левое соединение.
У вас левое соединение получается неявным подазпросом (читай - вложенным запросом)
4 timurhv
 
07.09.23
01:36
(3) а если:
И (ВЫБОР
                КОГДА ПодневныеДанныеУчетаВремени.ПереходящаяЧастьТекущейСмены
                    ТОГДА ДОБАВИТЬКДАТЕ(ПодневныеДанныеУчетаВремени.Дата, ДЕНЬ, 1)
                ИНАЧЕ ПодневныеДанныеУчетаВремени.Дата
            КОНЕЦ = ДанныеПроизводственногоКалендаря.Дата)

Заменить на:
И ПодневныеДанныеУчетаВремени.Дата = ДанныеПроизводственногоКалендаря.Дата

?
5 Momus
 
07.09.23
08:07
(3) ну в принципе так можно сделать, да. Но даже без левого соединение запроса выполняется долго. Мне непонятно, почему с пустой ВТФильтрДля он выполняется столько времени?
Справочник.ГрафикиРаботыСотрудников ~ 150 элементов
ПланВидовРасчета.Начисления.ВидыВремени ~ 150 элементов
РегистрСведений.ГрафикиРаботыПоВидамВремени ~ 2000000 элементов
Просто мб я что-то не знаю очевидное по теме запросов...
6 Momus
 
07.09.23
08:23
В ЗУП наверняка тоже есть документ "Резервы по оплате труда"? У вас он корректно работает? Этот документ создается некой операцией (возможно при закрытии месяца) автоматически непроведенным. Такой документ открыть нельзя, т.к. не заполняется реквизит табличной части "Идентификатор строки". Если же его вручную создать, то все ок (правда по кнопке заполнить приходится ждать минут 15, но как говорит бухгалтер так было всегда. Возможно по этой причине он и создается автоматически). Буду ковырять закрытие месяца, ибо причина неработоспособности документа в незаполненном идентификаторе, а запрос в теме следствие этой ошибки (хотя мне все равно непонятно почему он так долго выполняется).
7 Мимохожий Однако
 
07.09.23
08:30
Замеры делал?
8 Momus
 
07.09.23
08:38
(7) всм? бесконечно выполняется выполнение запроса. Один из них - выше. Я просто не ждал больше 20 минут и убивал сеанс. Сейчас выяснилось, за ночь tempdb вырос до 1тб. Я вроде бы зависший сеансы убил все, но видимо нет