Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема inner join vs in (select) (число прочтений - 3373 )
Shaman100m
YaBB Newbies
*
Отсутствует



Сообщений: 7
Местоположение: Кострома
Зарегистрирован: 29. Апреля 2013
Пол: Мужской
inner join vs in (select)
01. Мая 2013 :: 11:04
Печать  
Добрый день. Подскажите пожалуйста, какую конструкцию предпочтительнее использовать для вложенного условия в запросе по полю "Справочник" (основная таблица - регистр) :

INNER JOIN $Справочник.Товары AS Спр ON Спр.ID = $Рег.Товар AND ($Спр.СвойствоТовара1 IN(' ...',' ...') OR $Спр.СвойствоТовара2 IN(' ...',' ...'))

или

WHERE $Рег.Товар IN (SELECT Спр.ID FROM $Справочник.Товары WHERE ...)

?

В случае INNER JOIN где лучше собрать условия - в условии объединения или в общем WHERE ?
  
Наверх
IP записан
 
kos
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 127
Местоположение: Киев
Зарегистрирован: 03. Марта 2013
Re: inner join vs in (select)
Ответ #1 - 02. Мая 2013 :: 08:23
Печать  
Думаю лучше сделать 2 запроса
1) по справочнику получить список элементов для отбора

   select Спр.id from $Справочник...... where .....
   ...
   тз.Выгрузить(СписокЭлементов,,"id")

2) после - отдельно запрос к регистру

   select Рег..... from ... where Спр.id in (select val #ItemList)
   рс.УложитьСписок(СписокЭлементов,"#ItemList",Спр.Вид())

ИМХО.
Может есть более изящный способ - одним запросом.
Но думаю - так более наглядно и универсально.

Или чтобы не гонять данные "клиент-сервер"
сделать "пакетный запрос" - 2 в одном:

ТекстЗапроса = "
| select Спр.id from $Справочник...... into #ItemList where .....
| go;
| select Рег..... from ... where Спр.id in (select val from  #ItemList)
| go;
|";

Может с синтаксисом напутал.
В доке по TSQL можно посмотреть точнее на "SELECT....INTO"

В случае пакетного запроса (второй вариант)
я не уверен что именно вернет в качестве результата


тз = рс.ВыполнитьИнструкцию(ТекстЗапроса);

- будет ли там результат 1-го select или 2-го....
 не проверял, можете проверить.

Если в точности - "по сабжу"
то я не знаю как я мог бы сравнить join vs in:
- у них "техника" разная

1) в случае "in" - это те же 2 (и более) запросов:
   выполяются последовательно - сперва вложенный,
   потом оберка (тот что с условием in, наружный)

2) в случае join - это один запрос
   как бы через виртуальную view-таблицу.
   точнее это тоже выборка из 2х этапов:
   - сбор данных из источников
   - компановка их в результат

Как правило join работает (при равных исходных данных)
быстрее чем in. Хотя...

И еще:

любые where (по полям или с вычислениями) - это всегда накладные расходы

И еще:
- если использовать in - можно построить некоторый
 универсаьный набор запросов
 и на их основе сделать свой некоторый КОП с общими методами
- а join - это всегда специфические запросы
 к конкрентным   таблицам - поэтому универсальности добиться
 вряд ли получится
Опять же - смотрите на свою цель.


Вопрос в сабже - это быстрее теоретический вопрос.

Если я не прав - пусть гуру меня поправят.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: inner join vs in (select)
Ответ #2 - 06. Мая 2013 :: 04:27
Печать  
Shaman100m писал(а) 01. Мая 2013 :: 11:04:
Добрый день. Подскажите пожалуйста, какую конструкцию предпочтительнее использовать для вложенного условия в запросе по полю "Справочник" (основная таблица - регистр) :

INNER JOIN $Справочник.Товары AS Спр ON Спр.ID = $Рег.Товар AND ($Спр.СвойствоТовара1 IN(' ...',' ...') OR $Спр.СвойствоТовара2 IN(' ...',' ...'))

или

WHERE $Рег.Товар IN (SELECT Спр.ID FROM $Справочник.Товары WHERE ...)

?

В случае INNER JOIN где лучше собрать условия - в условии объединения или в общем WHERE ?




Лучше всего будет научиться курить планы запросов и самостоятельно обнаружить, что в 99% случаев план запроса будет идентичный.
  
Наверх
 
IP записан
 
rt001
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 82
Зарегистрирован: 31. Января 2013
Re: inner join vs in (select)
Ответ #3 - 04. Июня 2013 :: 05:37
Печать  
Satans Claws писал(а) 06. Мая 2013 :: 04:27:
Shaman100m писал(а) 01. Мая 2013 :: 11:04:
Добрый день. Подскажите пожалуйста, какую конструкцию предпочтительнее использовать для вложенного условия в запросе по полю "Справочник" (основная таблица - регистр) :

INNER JOIN $Справочник.Товары AS Спр ON Спр.ID = $Рег.Товар AND ($Спр.СвойствоТовара1 IN(' ...',' ...') OR $Спр.СвойствоТовара2 IN(' ...',' ...'))

или

WHERE $Рег.Товар IN (SELECT Спр.ID FROM $Справочник.Товары WHERE ...)

?

В случае INNER JOIN где лучше собрать условия - в условии объединения или в общем WHERE ?


Лучше всего будет научиться курить планы запросов и самостоятельно обнаружить, что в 99% случаев план запроса будет идентичный.

и посмотреть EXISTS()
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать