Имя: Пароль:
1C
 
Как оптимизировать запрос?
,
0 RomaH
 
naïve
24.04.18
09:07

    втУслуги КАК втУслуги
        ЛЕВОЕ СОЕДИНЕНИЕ втСостояниеДокументов КАК втСостояниеДокументов
        ПО (ВЫБОР
                КОГДА втУслуги.Заказ = ЗНАЧЕНИЕ(Документ.ЗаказКлиентаМИС.ПустаяСсылка)
                    ТОГДА втУслуги.Акт = втСостояниеДокументов.Акт
                КОГДА втУслуги.Акт = ЗНАЧЕНИЕ(Документ.АктВыполненныхРаботПоЗаказу.ПустаяСсылка)
                    ТОГДА втУслуги.Заказ = втСостояниеДокументов.Заказ
                ИНАЧЕ втУслуги.Заказ = втСостояниеДокументов.Заказ
                        И втУслуги.Акт = втСостояниеДокументов.Акт
            КОНЕЦ)



есть вот такое соединение
как его оптимизировать можно?
1 Mankubus
 
24.04.18
09:09
(0) разбить на 3 объединения?
2 Рэйв
 
24.04.18
09:16
Если имелось в виду, что при пустом заказе соединяется по акту,при пустом акте - по заказу, а при заполенных реквизитах и по акту и по заказу, то тут и так все оптимально вроде.
3 RomaH
 
naïve
24.04.18
09:21
(2) профайлер на такое соединение выдает 50 000 и потом на такое же еще 90 000
4 systemstopper
 
24.04.18
09:22
(3) 50000 чего?
5 Рэйв
 
24.04.18
09:22
(3)Так сама задумка не легкая. Так что результат естественен.
6 RomaH
 
naïve
24.04.18
09:25
объединение вроде помогает
надо только конечный результат сверить


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

ОБЪЕДИНИТЬ ВСЕ

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

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    втСостояниеДокументов.СостояниеЗакрытия,
    втСостояниеДокументов.СостояниеОплатыАкта,
    втУслуги.Заказ,
    втУслуги.Акт,
    втУслуги.Номенклатура,
    втУслуги.СпециалистПоАкту,
    втУслуги.КоличествоПоАкту,
    ВЫБОР
        КОГДА втСостояниеДокументов.СостояниеОплатыАктаЧислом = 10
            ТОГДА втУслуги.СуммаПоАкту
        ИНАЧЕ 0
    КОНЕЦ,
    втУслуги.МедПерсонал,
    втУслуги.ДатаВыполнения,
    втУслуги.Количество,
    втУслуги.Сумма,
    втУслуги.Специалист,
    втУслуги.ЦФУОплаты,
    втУслуги.ДатаОплаты,
    втУслуги.СуммаОплатыВнеПериода,
    втУслуги.ПериодОплаты
ИЗ
    втУслуги КАК втУслуги
        ЛЕВОЕ СОЕДИНЕНИЕ втСостояниеДокументов КАК втСостояниеДокументов
        ПО втУслуги.Заказ = втСостояниеДокументов.Заказ
            И втУслуги.Акт = втСостояниеДокументов.Акт
ГДЕ
    втУслуги.Заказ <> ЗНАЧЕНИЕ(Документ.ЗаказКлиентаМИС.ПустаяСсылка)
    И втУслуги.Акт <> ЗНАЧЕНИЕ(Документ.АктВыполненныхРаботПоЗаказу.ПустаяСсылка)
7 catena
 
24.04.18
09:29
Просто интересно, а если так?

ЕстьNULL(втУслуги.Заказ.Ссылка, втСостояниеДокументов.Заказ)=втСостояниеДокументов.Заказ
и
ЕстьNULL(втУслуги.Акт.Ссылка, втСостояниеДокументов.Акт)=втСостояниеДокументов.Акт
8 unregistered
 
24.04.18
09:30
(0) А почему нельзя по ИЛИ соединить?

втУслуги.Заказ = втСостояниеДокументов.Заказ
   И втУслуги.Акт = втСостояниеДокументов.Акт
ИЛИ втУслуги.Заказ = ЗНАЧЕНИЕ(Документ.ЗаказКлиентаМИС.ПустаяСсылка)
   И втУслуги.Акт = втСостояниеДокументов.Акт
ИЛИ втУслуги.Акт = ЗНАЧЕНИЕ(Документ.АктВыполненныхРаботПоЗаказу.ПустаяСсылка)
   И втУслуги.Заказ = втСостояниеДокументов.Заказ
9 RomaH
 
naïve
24.04.18
09:31
(4) duration
10 RomaH
 
naïve
24.04.18
09:32
(8) а ХЗ
мне не нужно соединение по заказу, если заказ пустой
11 unregistered
 
24.04.18
09:35
(10) >> мне не нужно соединение по заказу, если заказ пустой

Это несколько противоречит (0):

ВЫБОР КОГДА втУслуги.Заказ = ЗНАЧЕНИЕ(Документ.ЗаказКлиентаМИС.ПустаяСсылка)
   ТОГДА втУслуги.Акт = втСостояниеДокументов.Акт
12 RomaH
 
naïve
24.04.18
09:37
(11) как раз не противоречит
если заказ пустой - соединяю по АКТУ
все - дальше не соединяем
13 RomaH
 
naïve
24.04.18
09:41
да - пока остановимся на объединении
теперь продолжительность меньше 1000
(8) ИЛИ - 100% не подойдет
(7) - не врубаюсь что там почему - но тут похоже опять проверка последующих условий, а у меня они по приоритету выстроены
14 systemstopper
 
24.04.18
09:45
(6) Лучше до соединения с втСостояниеДокументов сначала сделай 3 временные таблицы из втУслуги по нужным условиям, а потом уже соединение делай с каждой и объединяй.
15 Сти
 
24.04.18
09:48
(12) то есть при этом в втСостояниеДокументов заказ может быть не пустым?
16 RomaH
 
naïve
24.04.18
09:52
(15) вполне
17 youalex
 
24.04.18
09:58
(1)
или три соединения,  но тогда  для полей втСостояниеДокументов  придется isnull городить
18 timurhv
 
24.04.18
10:07
(0) Заказ и Акт - составные типы?
19 RomanYS
 
24.04.18
10:16
(0)

втУслуги.Заказ В (ЗНАЧЕНИЕ(Документ.ЗаказКлиентаМИС.ПустаяСсылка), втСостояниеДокументов.Заказ)

И втУслуги.Акт В (ЗНАЧЕНИЕ(Документ.АктВыполненныхРаботПоЗаказу.ПустаяСсылка), втСостояниеДокументов.Акт)