|
Как оптимизировать запрос по остаткам и документам? | ☑ | ||
---|---|---|---|---|
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) то же думаю, что лишняя. Ее добавил, чтобы понять уж не из-за остатков или тормоза.
Решилось приведением к типу ВЫРАЗИТЬ(ДокументПередачи КАК Документ.РеализацияТоваровУслуг).Дата |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |