Имя: Пароль:
1C
1С v8
Почему внутреннее соединение медленнее, чем левое
,
0 John83
 
04.08.16
17:07
Если в запросе поставить внутреннее соединение, то отрабатывает в несколько раз дольше. Почему так?

ВЫБРАТЬ
    РасчетыСКонтрагентамиЗаявкиОбороты.Регистратор КАК ДокументОплаты,
    РасчетыСКонтрагентамиЗаявкиОбороты.Организация,
    РасчетыСКонтрагентамиЗаявкиОбороты.Контрагент,
    РасчетыСКонтрагентамиЗаявкиОбороты.ДоговорКонтрагента,
    РасчетыСКонтрагентамиЗаявкиОбороты.Сделка,
    РасчетыСКонтрагентамиЗаявкиОбороты.СуммаВзаиморасчетовОборот КАК СуммаОплаты,
    ВЫРАЗИТЬ(РасчетыСКонтрагентамиЗаявкиОбороты.Регистратор КАК Документ.ПлатежноеПоручениеВходящее).Дата КАК ДатаОплаты,
    ПродажиЗаявкиОбороты.ДокументПродажи КАК ДокументПродажи,
    ВЫБОР
        КОГДА РасчетыСКонтрагентамиЗаявкиОбороты.ДоговорКонтрагента.ОсновнойМенеджер <> ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка)
            ТОГДА РасчетыСКонтрагентамиЗаявкиОбороты.ДоговорКонтрагента.ОсновнойМенеджер
        ИНАЧЕ РасчетыСКонтрагентамиЗаявкиОбороты.Контрагент.ОсновнойМенеджерПокупателя
    КОНЕЦ КАК ОсновнойМенеджер,
    РасчетыСКонтрагентамиЗаявкиОбороты.ЗаказЗаявка
ПОМЕСТИТЬ ВсеДокументыОплаты
ИЗ
    РегистрНакопления.РасчетыСКонтрагентамиЗаявки.Обороты(, , Регистратор, ) КАК РасчетыСКонтрагентамиЗаявкиОбороты
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПродажиЗаявки.Обороты(&ДатаНач, &ДатаКон, , ) КАК ПродажиЗаявкиОбороты
        ПО РасчетыСКонтрагентамиЗаявкиОбороты.Сделка = ПродажиЗаявкиОбороты.ЗаказЗаявка
            И РасчетыСКонтрагентамиЗаявкиОбороты.ЗаказЗаявка = ПродажиЗаявкиОбороты.ЗаказПокупателя
ГДЕ
    РасчетыСКонтрагентамиЗаявкиОбороты.Регистратор ССЫЛКА Документ.ПлатежноеПоручениеВходящее
1 Жан Пердежон
 
04.08.16
17:12
Есть такие базовые заклинания: профайлер, план запроса, обновление статистики...
2 В тылу врага
 
04.08.16
17:12
поля соединений индексированные?
3 ptiz
 
04.08.16
17:28
(0) А условие ты убираешь при внутреннем? Тогда - да, возможно.
4 John83
 
04.08.16
17:33
(3) какое условие?
5 John83
 
04.08.16
17:33
(2) нет
6 polosov
 
04.08.16
17:40
(0) Запрос с левым соединением с условием ГДЕ, всегда превращается в запрос с внутренним соединением.
7 ovrfox
 
04.08.16
18:15
(6) Ну ты загнул.
Запрос с внутренним соединением всегда можно преобразовать в левое с условием. Обратное - НЕВЕРНО.
8 Fram
 
04.08.16
18:19
(6) аккуратнее надо быть с изречениями. после такого могут уволить
9 НеБорис Нуралиев
 
04.08.16
18:35
Ну тут фактически два подзапроса соединяются, возможно оптимизатор  не самый оптимальный план выбирает, потому что статистики нет и взять негде.

Попробуй условие из ГДЕ в условие внутреннего соединения вставить. Возможно быстрее отработает.
10 Tateossian
 
04.08.16
18:38
(0) Слышал от гуру, что с виртуальными таблицами вообще лучше не делать соединений.
11 ptiz
 
04.08.16
18:44
(4) Которое "ГДЕ".
12 hitodom
 
04.08.16
18:49
скл выбирает другой тип соединения моет быть хэш джойн и обламывается
13 Fragster
 
гуру
04.08.16
18:53
вместо РегистрНакопления.РасчетыСКонтрагентамиЗаявки.Обороты использовать РегистрНакопления.РасчетыСКонтрагентамиЗаявки, а РегистрНакопления.ПродажиЗаявки.Обороты запихать предварительно во временную таблицу
14 Fragster
 
гуру
04.08.16
18:53
ну а вообще ответ в (1)
15 John83
 
05.08.16
12:27
(10) (13) да, сам что-то забыл про такое..
16 John83
 
05.08.16
12:27
в общем запрос сделал несколько иначе
всем спасибо!
17 quest
 
05.08.16
12:30
сделай Выразить для регистратора - у тебя и план упростится сразу, и от условия уйдешь
18 b_ru
 
05.08.16
12:54
(10) у тебя в слове "долбодятел" множество ошибок - получилось "гуру"
19 Fragster
 
гуру
05.08.16
14:08
(17) нет, не упростится