Имя: Пароль:
1C
 
Как оптимизировать запрос по остаткам и документам?
0 ИС-2
 
naïve
22.01.15
08:53
Суть запроса - получение еще неотгруженных реализаций за период с расходными ордерами (если есть)

Он выполняется непозвонительно долго (2 секунды). Объем данных на выходе очень маленький - несколько строк.

Что в нем надо поправить, чтобы стал выполняться моментально

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_КПередаче.Склад,
    ВТ_КПередаче.Документ,
    ВТ_КПередаче.КоличествоОстаток,
    ВТ_КПередаче.Документ.Номер,
    ВТ_КПередаче.Документ.Контрагент КАК Контрагент,
    РасходныйОрдерНаТовары.Ссылка.Номер КАК НомерОрдер,
    РасходныйОрдерНаТовары.Ссылка.Дата КАК ДатаОрдер,
    РасходныйОрдерНаТовары.Ссылка КАК Ордер,
    ВТ_КПередаче.Документ.Номер КАК ИсхНомерДокумент,
    РасходныйОрдерНаТовары.Дата КАК ВремяОрдер
ИЗ
    ВТ_КПередаче КАК ВТ_КПередаче
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РасходныйОрдерНаТовары КАК РасходныйОрдерНаТовары
        ПО ВТ_КПередаче.Склад = РасходныйОрдерНаТовары.Склад
            И (ВТ_КПередаче.Документ = (ВЫРАЗИТЬ(РасходныйОрдерНаТовары.ДокументПередачи КАК Документ.РеализацияТоваровУслуг)))
            И (РасходныйОрдерНаТовары.Дата > ДОБАВИТЬКДАТЕ(&ДатаНач, ДЕНЬ, -365))

УПОРЯДОЧИТЬ ПО
    ДатаОрдер
1 Maxus43
 
22.01.15
08:55
В соединениях ВЫРАЗИТЬ - зло злющее
И (ВТ_КПередаче.Документ = (ВЫРАЗИТЬ(РасходныйОрдерНаТовары.ДокументПередачи КАК Документ.РеализацияТоваровУслуг)))


ВТ тут впринципе ненужна, накладных расходов имхо больше
2 Maxus43
 
22.01.15
08:57
для начала Выразить из соединения выбрось, оно там не надо, у тебя ж соединение, с другим типом не соединит
3 ИС-2
 
naïve
22.01.15
09:37
(2) почему. С типом может и не соединит, а вот другие таблицы думаю попробует использовать. Хотя надо профайлером смотреть.

Прирост дало изменение фильтра по дате в параметрах виртуальной таблицы
с

ДокументПередачи.Дата

на

ВЫРАЗИТЬ(ДокументПередачи КАК Документ.РеализацияТоваровУслуг).Дата
4 ИС-2
 
naïve
23.01.15
08:43
как писать с одним типом понятно.
ВЫРАЗИТЬ(ДокументПередачи КАК Документ.РеализацияТоваровУслуг)

Если из нескольких типов мне надо оставить 2, то какой должен быть синтаксис?
5 unregistered
 
23.01.15
08:53
(4) ИМХО, никак.
Либо писать все неявные левые соединения вручную для каждого вида документов.
Либо чере ИЛИ:
ВЫРАЗИТЬ(ДокументПередачи КАК Документ.РеализацияТоваровУслуг)... ИЛИ ВЫРАЗИТЬ(ДокументПередачи КАК Документ.ДругойДокументРеализации)...
6 ИС-2
 
naïve
23.01.15
08:55
(5) согласно информации тормознутие конструкции ИЛИ только в Иерархии
7 unregistered
 
23.01.15
08:57
(0) Если предполагается, что временная таблица ВТ_КПередаче может быть большой, то можно её проиндексировать по полям соединения (Склад и Документ).

Но скорее Maxus43 прав в (1): временная таблица тут - это лишнее.
8 ИС-2
 
naïve
23.01.15
09:01
(7) то же думаю, что лишняя. Ее добавил, чтобы понять уж не из-за остатков или тормоза.
Решилось приведением к типу ВЫРАЗИТЬ(ДокументПередачи КАК Документ.РеализацияТоваровУслуг).Дата
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.