Что быстрее? В или ЛЕВОЕ СОЕДИНЕНИЕ?

1. KazanKokos 10 02.06.22 13:47 Сейчас в теме
Коллеги подскажите какой запрос отработает быстрее?:

ВЫБРАТЬ 
   МД.Ссылка 
     ПОМЕСТИТЬ вт_МоиДокументы 
ИЗ Документ.МойДокумент КАК МД 
ГДЕ НачалоПериода(МД.Дата, ДЕНЬ) = НачалоПериода(&Дата, День);

ВЫБРАТЬ 
 ТаблицаМоегоДокумента.Ссылка, 
 ТаблицаМоегоДокумента.ЧегоТоТам 
ИЗ Документ.МойДокумент.ТакаяТоТаблица КАК ТаблицаМоегоДокумента 
ГДЕ ТаблицаМоегоДокумента.Ссылка В (Выбрать Ссылка ИЗ вт_МоиДокументы)
Показать


или

ВЫБРАТЬ 
 МД.Ссылка 
ПОМЕСТИТЬ вт_МоиДокументы 
ИЗ Документ.МойДокумент КАК МД 
ГДЕ НачалоПериода(МД.Дата, ДЕНЬ) = НачалоПериода(&Дата, День);

ВЫБРАТЬ 
ТаблицаМоегоДокумента.Ссылка, 
ТаблицаМоегоДокумента.ЧегоТоТам 
ИЗ вт_МоиДокументы КАК вт_МоиДокументы
ЛЕВОЕ СОЕДИНЕНИЕ Документ.МойДокумент.ТакаяТоТаблица КАК ТаблицаМоегоДокумента 
ПО вт_МоиДокументы.Ссылка = ТаблицаМоегоДокумента .Ссылка
Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
7. spacecraft 02.06.22 14:21 Сейчас в теме
(1) для небольшой выборки во временную таблицу, разницу не почувствуете.
А так in более тяжелый. Это подзапрос в цикле.
Но и join не обязательно будет лучшим вариантом.
Оптимизацией занимаются, когда это необходимо и для каждого случая она может быть различной.
17. spacecraft 02.06.22 15:12 Сейчас в теме
(1) еще есть такой вариант:
ВЫБРАТЬ 
ТаблицаМоегоДокумента.Ссылка, 
ТаблицаМоегоДокумента.ЧегоТоТам 
ИЗ Документ.МойДокумент.ТакаяТоТаблица КАК ТаблицаМоегоДокумента 
ГДЕ НачалоПериода(ТаблицаМоегоДокумента.Ссылка.Дата, ДЕНЬ) = НачалоПериода(&Дата, День);

Этот запрос развернется в запрос с левым соединением, но левой таблицей будет выступать табличная часть. Соответственно по результату выбираемых данных будет аналогичен первому варианту, а по построению - второму варианту.

Приведенные два варианта не идентичны в общем случае.
18. KazanKokos 10 02.06.22 15:20 Сейчас в теме
(17) Ну я для примера привел. На самом деле первую выборку документов я получаю из РС. А дальше по этим документам делаю еще несколько таблиц.
20. Sashares 34 02.06.22 15:37 Сейчас в теме
(1)
НачалоПериода(&Дата, День);

Можно предложить попробовать это переделать, примерно так:
ГДЕ
МД.Дата >= &ДатаН
И МД.Дата <= &ДатаК


Где ДатаН - начало дня, ДатаК - конец дня.
Т.к. преобразования даты в условии, тем более параметра, плохо влияют на производительность.
PlatonStepan; +1 Ответить
21. spacecraft 02.06.22 15:53 Сейчас в теме
(20) в данном примере оптимизатор именно в эту конструкцию и преобразовывает.
22. Sashares 34 02.06.22 16:00 Сейчас в теме
(21) В стандартах так делать не рекомендуется.
https://its.1c.ru/db/v8std#content:658:hdoc

Еще где-то читал, что преобразование параметров в запросе также не рекомендуется использовать, на вскидку не нашел.
Прикрепленные файлы:
23. spacecraft 02.06.22 16:04 Сейчас в теме
(22) тут разный смысл. Преобразование поля и константы.
Для константы (вх. параметра запроса) преобразование делается один раз и подставляется уже сразу нужные значения. Для поля делается для каждой получаемой записи.
26. Sashares 34 02.06.22 16:16 Сейчас в теме
(23)Не готов спорить, но слышал другую информацию =)
Если у вас есть время, можете попробовать сравнить.
24. spacecraft 02.06.22 16:15 Сейчас в теме
(22) вот что показал план выполнения запроса, для конструкции
ГДЕ НачалоПериода(МД.Дата, ДЕНЬ) = НачалоПериода(&Дата, День):
WHERE
        (T2.Дата >= 20170512000000)
        AND
        (T2.Дата <= 20170512235959)
27. Sashares 34 02.06.22 16:18 Сейчас в теме
(24) Спасибо за информацию
31. PlatonStepan 38 03.06.22 10:12 Сейчас в теме
(24)
Интересно, конечно, но вы даёте отчёт, что оптимизатор отработает именно так на всех версиях 1С и для всех СУБД?
А если условие будет немного иное?
33. spacecraft 03.06.22 10:40 Сейчас в теме
(31) не нужно принижать возможности оптимизатора. Ну и не возводить в абсолют. Сложные условия желательно перерабатывать, для помощи оптимизатору.
Но в данном случае это простое условие и оптимизатор это поймет правильно.
28. KazanKokos 10 02.06.22 19:04 Сейчас в теме
(17)
(20) Опять таки условие поставил наобум. Я на самом деле делаю другую выборку документов. Мне главное было сравнить В и Соединение :)
29. SlavaKron 02.06.22 19:40 Сейчас в теме
(1) База файловая или клиент-серверная?
30. KazanKokos 10 03.06.22 10:01 Сейчас в теме
3. ls600 02.06.22 14:07 Сейчас в теме
сколько каждый запрос по времени отрабатывает?
6. KazanKokos 10 02.06.22 14:09 Сейчас в теме
(3) Как раз проверяю. Пока по теме нашел только что в несколько раз: ТУТ
4. DENSKR 15 02.06.22 14:08 Сейчас в теме
Так как в первом случае дополнительный подзапрос
В (Выбрать Ссылка ИЗ вт_МоиДокументы)
определенно не сказать не замерив результаты, но наверное в вашем случае внутреннее соединение отработает оптимальнее всего используя индексировать по "ваше поле с индексом"
5. homer_ 78 02.06.22 14:08 Сейчас в теме
В теории разницы не должно быть. Но по мне 1 запрос правильнее.
8. VZyryanov 02.06.22 14:33 Сейчас в теме
1. Аналог "В" это "ВНУТРЕННЕЕ СОЕДИНЕНИЕ", а не "ЛЕВОЕ". Внутреннее соединение работает быстрее левого. Думаю, что внутренне соединение быстрее "В" - вроде бы это самое быстрое соединение 2-х таблиц.
2. 2-ой запрос с ошибкой "ПО ТаблицаМоегоДокумента.Ссылка = ТаблицаМоегоДокумента .Ссылка" - нет соединения с вт_МоиДокументы.
9. redfred 02.06.22 14:49 Сейчас в теме
(8)
Аналог "В" это "ВНУТРЕННЕЕ СОЕДИНЕНИЕ", а не "ЛЕВОЕ".


Строго говоря, нет. Если поле, по которому джойнится правая таблица, не уникально, то там вполне может вернуться больше строк, чем при in.
FatPanzer; +1 Ответить
10. KazanKokos 10 02.06.22 14:55 Сейчас в теме
(9) не помогло короче. нет разницы :)
16. DENSKR 15 02.06.22 15:11 Сейчас в теме
(10) попробуйте на таблицах где 1 000 000+ строк
19. KazanKokos 10 02.06.22 15:21 Сейчас в теме
(16) насколько я понял там разница не в разы. В моем случае как было 86 секунд так и осталось....
15. VZyryanov 02.06.22 15:11 Сейчас в теме
(9) Согласен. Но левое соединение в общем случае вернет еще больше строк, чем внутреннее.
11. naukaalexandr 02.06.22 14:56 Сейчас в теме
Второй запрос отработает быстрее
12. naukaalexandr 02.06.22 14:58 Сейчас в теме
На я бы вместо обращения к документам обратился к виртуальной таблице ккакого нибудь регистра, по кототрому Ваш документ делает движения тогда вообще молниеносно сработает
13. FatPanzer 02.06.22 14:58 Сейчас в теме
Лично я бы сделал комбинацию. Два подзапроса.
1. Выбрать во временную таблицу с отбором по периоду и ПРОИНДЕКСИРОВАТЬ по Ссылке
2. Внутреннее соединение с временной таблицей по заранее проиндексированному полю.

Можно извратить и проверить вариант, когда и таблица документа выгружается в ВТ и тоже индексируется (то есть уже три подзапроса двумы индексируемыми ВТ).
14. Dem0 02.06.22 15:05 Сейчас в теме
В разных случаях очень по-разному.
Все зависит от того, какой в итоге план запроса получится. Это еще и от частоты обновления статистик на сервере зависит.
25. soft_wind 02.06.22 16:16 Сейчас в теме
(19) 86 сек это много
попробуйте такой запрос без ВТ
ВЫБРАТЬ 
ТаблицаМоегоДокумента.Ссылка, 
ТаблицаМоегоДокумента.ЧегоТоТам 
ИЗ
//или еще здесь взять таблицу Документ.МойДокумент и к ней левым ТЧ
Документ.МойДокумент.ТакаяТоТаблица КАК ТаблицаМоегоДокумента 
где
ТаблицаМоегоДокумента.ссылка.Дата между &Дата1 и &Дата2 //в параметрах как Начало и Конец дня

Показать
32. PlatonStepan 38 03.06.22 10:22 Сейчас в теме
(25)

А что изменилось? То же самое - неявное присоединение "МойДокумент".

Тут автор не показывает какой объём таблицы в целом, какой объём выборки на день, и какой объём тч, так что судить много-мало - сложновато.

Может всё время уходит на отражение данных ЧегоТоТам, если ЧегоТоТам ссылка, либо нечто составного типа или ХранилищеЗначения
34. soft_wind 03.06.22 10:45 Сейчас в теме
(32) идея была не использовать временную таблицу, сразу отбирать по дате, именно командой "Между"
документы очень хорошо индексированы по дате
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот