странные запросы 1Сv8

Открываю сегодня я код и как-то мозги мои начинает подклинивать:


ВЫБРАТЬ
    регСобытияОбъектов.Документ_Основание,
    регСобытияОбъектов.ВидДокумента,
    регСобытияОбъектов.ДатаЗаписи,
    регСобытияОбъектов.ЗаказДата,
    регСобытияОбъектов.ЗаказНомер,
    регСобытияОбъектов.Контрагент,
    регСобытияОбъектов.Организация,
    ВЫРАЗИТЬ(регСобытияОбъектов.Документ_Основание КАК Документ.ЭКОМ_Документы).Документ1С КАК ДокументЗаказа,
    ВЫРАЗИТЬ(регСобытияОбъектов.Документ_Основание КАК Документ.ЭКОМ_Документы).ДатаПоставки КАК ДатаПоставки,
    ВЫРАЗИТЬ(регСобытияОбъектов.Документ_Основание КАК Документ.ЭКОМ_Документы).ТочкаДоставки КАК ТочкаДоставки,
    ВЫБОР
        КОГДА регСобытияОбъектов.Статус ЕСТЬ NULL
            ТОГДА ЛОЖЬ
        ИНАЧЕ ИСТИНА
    КОНЕЦ КАК Статус_ORDER,
    регСобытияОбъектов.ТекстОшибки
ПОМЕСТИТЬ основнаяORDER
ИЗ
    РегистрСведений.СобытияОбъектов КАК регСобытияОбъектов
ГДЕ
    регСобытияОбъектов.ВидДокумента = ЗНАЧЕНИЕ(Перечисление.ВидыДокументов.ORDER_Входящий)
    И регСобытияОбъектов.ЗаказДата МЕЖДУ &ДатаНач И &ДатаКон
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    регСобытияОбъектов.ВидДокумента,
    регСобытияОбъектов.Статус,
    регСобытияОбъектов.ЗаказДата,
    регСобытияОбъектов.ЗаказНомер,
    регСобытияОбъектов.ТекстОшибки
ПОМЕСТИТЬ ОбъектыСобытияСтатус
ИЗ
    (ВЫБРАТЬ
        МАКСИМУМ(регСобытияОбъектов.ДатаЗаписи) КАК ДатаЗаписи,
        регСобытияОбъектов.ЗаказДата КАК ЗаказДата,
        регСобытияОбъектов.ЗаказНомер КАК ЗаказНомер
    ИЗ
        основнаяORDER КАК основнаяORDER
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СобытияОбъектов КАК регСобытияОбъектов
            ПО основнаяORDER.ЗаказДата = регСобытияОбъектов.ЗаказДата
                И основнаяORDER.ЗаказНомер = регСобытияОбъектов.ЗаказНомер
   
    СГРУППИРОВАТЬ ПО
        регСобытияОбъектов.ЗаказДата,
        регСобытияОбъектов.ЗаказНомер) КАК ОбъектыСобытия_Последние
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.регСобытияОбъектов КАК регСобытияОбъектов
        ПО ОбъектыСобытия_Последние.ДатаЗаписи = регСобытияОбъектов.ДатаЗаписи
            И ОбъектыСобытия_Последние.ЗаказДата = регСобытияОбъектов.ЗаказДата
            И ОбъектыСобытия_Последние.ЗаказНомер = регСобытияОбъектов.ЗаказНомер

похоже этот код сгенерирован КонструкторомЗапросов 1С. Разобравшись что же нужно получить в итоге я преобразовал этот код без вложенных запросов и странных соединеий


ВЫБРАТЬ
    СобытияОбъектов.Документ_Основание,
    СобытияОбъектов.ВидДокумента,
    СобытияОбъектов.ДатаЗаписи,
    СобытияОбъектов.ЗаказДата,
    СобытияОбъектов.ЗаказНомер,
    СобытияОбъектов.Контрагент,
    СобытияОбъектов.Организация,
    ВЫРАЗИТЬ(СобытияОбъектов.Документ_Основание КАК Документ.ЭКОМ_Документы).Документ1С КАК ДокументЗаказа,
    ВЫРАЗИТЬ(СобытияОбъектов.Документ_Основание КАК Документ.ЭКОМ_Документы).ДатаПоставки КАК ДатаПоставки,
    ВЫРАЗИТЬ(СобытияОбъектов.Документ_Основание КАК Документ.ЭКОМ_Документы).ТочкаДоставки КАК ТочкаДоставки,
    ВЫБОР
        КОГДА СобытияОбъектов.Статус ЕСТЬ NULL
            ТОГДА ЛОЖЬ
        ИНАЧЕ ИСТИНА
    КОНЕЦ КАК Статус_ORDER,
    СобытияОбъектов.ТекстОшибки
ПОМЕСТИТЬ основнаяORDER
ИЗ
    РегистрСведений.СобытияОбъектов КАК СобытияОбъектов
ГДЕ
    СобытияОбъектов.ВидДокумента = ЗНАЧЕНИЕ(Перечисление.ВидыДокументов.ORDER_Входящий)
    И СобытияОбъектов.ЗаказДата МЕЖДУ &ДатаНач И &ДатаКон
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    СобытияОбъектов.ВидДокумента,
    МАКСИМУМ(СобытияОбъектов.ДатаЗаписи) КАК ДатаЗаписи,
    СобытияОбъектов.Статус,
    СобытияОбъектов.ЗаказДата,
    СобытияОбъектов.ЗаказНомер,
    СобытияОбъектов.ТекстОшибки
//ПОМЕСТИТЬ ОбъектыСобытияСтатус
ИЗ
    основнаяORDER КАК основнаяORDER
   
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СобытияОбъектов КАК СобытияОбъектов
    ПО основнаяORDER.ЗаказДата = СобытияОбъектов.ЗаказДата
     И основнаяORDER.ЗаказНомер = СобытияОбъектов.ЗаказНомер
     И основнаяORDER.ВидДокумента = ЗНАЧЕНИЕ(Перечисление.ВидыДокументов.ORDER_Входящий)

СГРУППИРОВАТЬ ПО
    СобытияОбъектов.ВидДокумента,
    СобытияОбъектов.Статус,
    СобытияОбъектов.ЗаказДата,
    СобытияОбъектов.ЗаказНомер,
    СобытияОбъектов.ТекстОшибки

Обратите внимание, здесь нужно лишь ЛЕВОЕ СОЕДИНЕНИЕ без вложенных подзапросов. Фактически я отбираю еще раз по той же таблице последние даты а затем к ним присоединяю необходимые последние значения. Последними они становятся т.к. я группирую поля и делаю функцию МАКСИМУМ() во 2м запросе.

Это изменение ускорило запрос на 20%

ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СобытияОбъектов КАК СобытияОбъектов
ПО основнаяORDER.ЗаказДата = СобытияОбъектов.ЗаказДата
И основнаяORDER.ЗаказНомер = СобытияОбъектов.ЗаказНомер
И основнаяORDER.ВидДокумента = ЗНАЧЕНИЕ(Перечисление.ВидыДокументов.ORDER_Входящий)

Обратите внимание что обращение к составным реквизитам нужно делать через ВЫРАЗИТЬ() явно указывая какого типа этот реквизит.

ВЫРАЗИТЬ(регСобытияОбъектов.ДокументОснование КАК Документ.ЭКОМДокументы).Документ1С

Как Вы видите здесь есть Неявное соединение с таблицей в которой хранится Документ_Основание. Поскольку от туда же берутся и остальные реквизиты то оптимизировать скорость этого запроса не удастся явно указывая соединение. Это и стало причиной, что я оставил данный код без изменений.

Author: Владимир Тюрюков

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *