Вход | Регистрация


Как оптимизировать запрос?

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



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

////////////////////////////////////////////////////////////////////////////////

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

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

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

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

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

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

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

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

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

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

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует