Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 INNER join или EXISTS  [new]
ura
Member [заблокирован]

Откуда: Киев
Сообщений: 932
Добрый день всем
Запрос
select t1.*

from table1 t1
where exists(select * from table2 t2 where t1.t2_id=t2.id)

или
select t1.*

from table1 t1 inner join table2 t2 on t1.t2_id=t2.id

поле table2.id - PK

Что лучше ? Сам я тестировал такие запросы, план выполнения одинаковый, но это простые случаи, в сложных конструкциях оптимизатор может и ошибиться. Так вот, реально, с какой конструкцией оптимизатор лучше (чаще)справляется ? Исходя из моего скромного опыта я могу сказать, что особой разницы не замечал, но может быть есть и другие мнения ?
5 дек 03, 15:07    [448844]     Ответить | Цитировать Сообщить модератору
 Re: INNER join или EXISTS  [new]
Crip
Member

Откуда:
Сообщений: 2490
В вашем случае конкретном случае без разницы.
А вообще запросы могут давать разные выборки... Для того собственно и разнится синтаксис
5 дек 03, 15:13    [448861]     Ответить | Цитировать Сообщить модератору
 Re: INNER join или EXISTS  [new]
ЗЫ
Guest
А можно еще и так
select t1.* 

from table t1
where t1.t2_id in (select t2.id from table2 t2)
5 дек 03, 15:17    [448874]     Ответить | Цитировать Сообщить модератору
 Re: INNER join или EXISTS  [new]
ura
Member [заблокирован]

Откуда: Киев
Сообщений: 932
2 Crip
Я написал, что в моем случае без разницы, и в моем же случае разные выборки быть не могут
2 ЗЫ
С in у меня лично опыт больше негативный, т.к. оптимизатор иногда его плохо воспринимает (а еще чаще not in). Потому, собственно я и поднял этот вопрос
5 дек 03, 15:25    [448894]     Ответить | Цитировать Сообщить модератору
 Re: INNER join или EXISTS  [new]
ЗЫ
Guest
с какой конструкцией оптимизатор лучше (чаще)справляется ?
Ну так это и будет зависеть в первую очередь от конструкции.
А иначе вопрос надо спрашивать так: "Как работает оптимизатор?"
5 дек 03, 15:41    [448934]     Ответить | Цитировать Сообщить модератору
 Re: INNER join или EXISTS  [new]
злой шаман
Member

Откуда: Питер
Сообщений: 1253
В простых запросах разницы не будет. В сложных случаях, где джойнов больше трех-четырех и не удается заставить оптимизатор выбрать оптимальную стратегию объединения, может вылечить вынесение одного-двух джойнов в if exists. Иногда получается ровно наоборот, все зависит от структуры данных и от самих данных.

На каждый чих не наздравствуешься, общих методик я не видел. Можно проводить через годик после реализации дополнительный тюнинг уже на реальных данных.
5 дек 03, 15:47    [448953]     Ответить | Цитировать Сообщить модератору
 Re: INNER join или EXISTS  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Полность согласен со злым шаманом. Надо все обкатывать на реальных данных и реальных запросах, а не на синтетических тестах.
5 дек 03, 15:49    [448959]     Ответить | Цитировать Сообщить модератору
 Re: INNER join или EXISTS  [new]
ura
Member [заблокирован]

Откуда: Киев
Сообщений: 932
Так кто ж спорит, что нужно на реальных данных обкатывать...
Просто когда идет разработка, и нет никаких данных, нужно выбрать один из варианотов в качестве корпоративного стандарта. Я думал, может у кого есть статистические данные по оптимальности этих вариантов. Я же не спрашиваю, что ВСЕГДА будет работать лучше. Ответ - абсолютно все равно- очень маловероятен, более-менее все равно - это может быть...
5 дек 03, 15:58    [448985]     Ответить | Цитировать Сообщить модератору
 Re: INNER join или EXISTS  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Каких этих, твоих что-ли? Да ты пойми, что при разной структуре запроса (кол-во полей в выборке, кол-во параметров, кол-во таблиц) каждый раз надо будет оптимизировать, причем вариантов может быть несколько. А если в теории, то пересечение двух множеств лучше искать с помошью EXISTS.
5 дек 03, 16:06    [449010]     Ответить | Цитировать Сообщить модератору
 Re: INNER join или EXISTS  [new]
ura
Member [заблокирован]

Откуда: Киев
Сообщений: 932
2 pkarklin
этих - имеется в виду общий подход по нахождению пересечения двух множеств. Ты что, каждый свой запрос разрабатываешь в нескольких вариантах, а потом изучаешь планы и выбираешь лучший вариант ? Так можно подходить только к очень тяжелым запросам, а когда приходится в день писать/менять хрен знает сколько ХП, то хотелось-бы выбрать один какой-то стиль. А при необходимости потом оптимизировать. А выбор стиля написания для множества простых запросов не должен зависить от кол-ва полей и таблиц в нем участвующих.
5 дек 03, 16:20    [449054]     Ответить | Цитировать Сообщить модератору
 Re: INNER join или EXISTS  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
автор
Ты что, каждый свой запрос разрабатываешь в нескольких вариантах, а потом изучаешь планы и выбираешь лучший вариант ?


Нет, ну общие правила, конечно, существуют. Но изучение плана выполнения и его анализ и выбор лучшего - святое дело.

автор
А выбор стиля написания для множества простых запросов не должен зависить от кол-ва полей и таблиц в нем участвующих.


Так то оно так, но в качестве примера могу вот что тебе привести. На план выполнения запроса может влиять что угодно, начиная от порядка таблиц в объединении до порядка следования условий в предложении WHERE. Так что даже при написании "самых простых" есть над чем повозиться.
5 дек 03, 16:27    [449081]     Ответить | Цитировать Сообщить модератору
 Re: INNER join или EXISTS  [new]
злой шаман
Member

Откуда: Питер
Сообщений: 1253
Если выбирать стандарт, то я бы делал все через inner join. Скобок меньше. И сопровождать приятнее. :)
5 дек 03, 16:37    [449108]     Ответить | Цитировать Сообщить модератору
 Re: INNER join или EXISTS  [new]
Glory
Member

Откуда:
Сообщений: 104760
И если вдруг понадобяться поля из других таблиц, то переписывать запрос не придется :)
5 дек 03, 16:40    [449112]     Ответить | Цитировать Сообщить модератору
 Re: INNER join или EXISTS  [new]
ЗЫ
Guest
2 ura
один из варианотов в качестве корпоративного стандарта
Если у вас несколько разработчиков даже лучше будет если один пишет так, а другой по другому. Тогда можно будет видеть кто писал. Ведь особой разницы не замечено

Да и вообще зачем этот стандарт нужен внутри сервера? Для клиентских форм понимаю, стандарт на сообщения понимаю. Зачем?
5 дек 03, 16:43    [449122]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить