Коллеги подскажите какой запрос отработает быстрее?:
ВЫБРАТЬ
МД.Ссылка
ПОМЕСТИТЬ вт_МоиДокументы
ИЗ Документ.МойДокумент КАК МД
ГДЕ НачалоПериода(МД.Дата, ДЕНЬ) = НачалоПериода(&Дата, День);
ВЫБРАТЬ
ТаблицаМоегоДокумента.Ссылка,
ТаблицаМоегоДокумента.ЧегоТоТам
ИЗ Документ.МойДокумент.ТакаяТоТаблица КАК ТаблицаМоегоДокумента
ГДЕ ТаблицаМоегоДокумента.Ссылка В (Выбрать Ссылка ИЗ вт_МоиДокументы)
Показать
или
ВЫБРАТЬ
МД.Ссылка
ПОМЕСТИТЬ вт_МоиДокументы
ИЗ Документ.МойДокумент КАК МД
ГДЕ НачалоПериода(МД.Дата, ДЕНЬ) = НачалоПериода(&Дата, День);
ВЫБРАТЬ
ТаблицаМоегоДокумента.Ссылка,
ТаблицаМоегоДокумента.ЧегоТоТам
ИЗ вт_МоиДокументы КАК вт_МоиДокументы
ЛЕВОЕ СОЕДИНЕНИЕ Документ.МойДокумент.ТакаяТоТаблица КАК ТаблицаМоегоДокумента
ПО вт_МоиДокументы.Ссылка = ТаблицаМоегоДокумента .Ссылка
(1) для небольшой выборки во временную таблицу, разницу не почувствуете.
А так in более тяжелый. Это подзапрос в цикле.
Но и join не обязательно будет лучшим вариантом.
Оптимизацией занимаются, когда это необходимо и для каждого случая она может быть различной.
ВЫБРАТЬ
ТаблицаМоегоДокумента.Ссылка,
ТаблицаМоегоДокумента.ЧегоТоТам
ИЗ Документ.МойДокумент.ТакаяТоТаблица КАК ТаблицаМоегоДокумента
ГДЕ НачалоПериода(ТаблицаМоегоДокумента.Ссылка.Дата, ДЕНЬ) = НачалоПериода(&Дата, День);
Этот запрос развернется в запрос с левым соединением, но левой таблицей будет выступать табличная часть. Соответственно по результату выбираемых данных будет аналогичен первому варианту, а по построению - второму варианту.
Приведенные два варианта не идентичны в общем случае.
(22) тут разный смысл. Преобразование поля и константы.
Для константы (вх. параметра запроса) преобразование делается один раз и подставляется уже сразу нужные значения. Для поля делается для каждой получаемой записи.
(24)
Интересно, конечно, но вы даёте отчёт, что оптимизатор отработает именно так на всех версиях 1С и для всех СУБД?
А если условие будет немного иное?
(31) не нужно принижать возможности оптимизатора. Ну и не возводить в абсолют. Сложные условия желательно перерабатывать, для помощи оптимизатору.
Но в данном случае это простое условие и оптимизатор это поймет правильно.
определенно не сказать не замерив результаты, но наверное в вашем случае внутреннее соединение отработает оптимальнее всего используя индексировать по "ваше поле с индексом"
1. Аналог "В" это "ВНУТРЕННЕЕ СОЕДИНЕНИЕ", а не "ЛЕВОЕ". Внутреннее соединение работает быстрее левого. Думаю, что внутренне соединение быстрее "В" - вроде бы это самое быстрое соединение 2-х таблиц.
2. 2-ой запрос с ошибкой "ПО ТаблицаМоегоДокумента.Ссылка = ТаблицаМоегоДокумента .Ссылка" - нет соединения с вт_МоиДокументы.
На я бы вместо обращения к документам обратился к виртуальной таблице ккакого нибудь регистра, по кототрому Ваш документ делает движения тогда вообще молниеносно сработает
Лично я бы сделал комбинацию. Два подзапроса.
1. Выбрать во временную таблицу с отбором по периоду и ПРОИНДЕКСИРОВАТЬ по Ссылке
2. Внутреннее соединение с временной таблицей по заранее проиндексированному полю.
Можно извратить и проверить вариант, когда и таблица документа выгружается в ВТ и тоже индексируется (то есть уже три подзапроса двумы индексируемыми ВТ).
В разных случаях очень по-разному.
Все зависит от того, какой в итоге план запроса получится. Это еще и от частоты обновления статистик на сервере зависит.
(19) 86 сек это много
попробуйте такой запрос без ВТ
ВЫБРАТЬ
ТаблицаМоегоДокумента.Ссылка,
ТаблицаМоегоДокумента.ЧегоТоТам
ИЗ
//или еще здесь взять таблицу Документ.МойДокумент и к ней левым ТЧ
Документ.МойДокумент.ТакаяТоТаблица КАК ТаблицаМоегоДокумента
где
ТаблицаМоегоДокумента.ссылка.Дата между &Дата1 и &Дата2 //в параметрах как Начало и Конец дня