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

Откуда:
Сообщений: 1214
SELECT st.*
	FROM sys.tables st
WHERE NOT EXISTS ( SELECT 1
		FROM sys.objects so
	WHERE so.object_id = st.object_id AND so.name = 'blah')
GO

SELECT st.*
	FROM  sys.tables  st
		LEFT JOIN sys.objects so ON so.object_id = st.object_id AND so.name = 'blah'
WHERE so.object_id IS NULL


Экзистс 44% джойн 56%.

Это частный случай или экзистс всегда быстрее?
31 май 17, 17:56    [20528508]     Ответить | Цитировать Сообщить модератору
 Re: NOT EXISTS vs LEFT JOIN  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Это относительная оценка, а не обсолютная и зависит от статистики. Хоть для обычных таблиц, хоть для системных. К слову sys.tables это тоже самое что и sys.objects + type='U' да и работать будет быстрее.
31 май 17, 18:01    [20528540]     Ответить | Цитировать Сообщить модератору
 Re: NOT EXISTS vs LEFT JOIN  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Вот +/- равнозначный запрос:

SELECT [name], [object_id], [schema_id]
FROM sys.objects
WHERE [object_id] != OBJECT_ID('dbo.blah')
    AND [type] = 'U'
31 май 17, 18:06    [20528564]     Ответить | Цитировать Сообщить модератору
 Re: NOT EXISTS vs LEFT JOIN  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
Эти два запроса в принципе могут дать разный результат.
31 май 17, 18:42    [20528679]     Ответить | Цитировать Сообщить модератору
 Re: NOT EXISTS vs LEFT JOIN  [new]
человек_ниоткуда
Guest
IMHO exist именно в принцыпе быстрее. Т.к. ты точно указываешь оптимизатору, что тебе нужно. Это увеличивает шансы получить более оптимальный план.
Более того IN хуже exist в некоторых случаях.
31 май 17, 19:17    [20528764]     Ответить | Цитировать Сообщить модератору
 Re: NOT EXISTS vs LEFT JOIN  [new]
ппп-пп
Guest
iap
Эти два запроса в принципе могут дать разный результат.


При определенных ограничениях будут давать одинаковые результаты - но суть вашего ответа в самую точку.
31 май 17, 19:35    [20528802]     Ответить | Цитировать Сообщить модератору
 Re: NOT EXISTS vs LEFT JOIN  [new]
o-o
Guest
человек_ниоткуда
IMHO exist именно в принцыпе быстрее. Т.к. ты точно указываешь оптимизатору, что тебе нужно. Это увеличивает шансы получить более оптимальный план.
Более того IN хуже exist в некоторых случаях.

А кто-то спрашивал про IN?
31 май 17, 19:35    [20528803]     Ответить | Цитировать Сообщить модератору
 Re: NOT EXISTS vs LEFT JOIN  [new]
msLex
Member

Откуда:
Сообщений: 8065
iap
Эти два запроса в принципе могут дать разный результат.

хмм, а при каких условиях?
31 май 17, 20:44    [20528925]     Ответить | Цитировать Сообщить модератору
 Re: NOT EXISTS vs LEFT JOIN  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31354
msLex
iap
Эти два запроса в принципе могут дать разный результат.

хмм, а при каких условиях?
Если object_id в sys.objects неуникально.
Это же просто пример, а не конкретный запрос с этими таблицами.
Т.е. в общем случае заменить EXISTS на LEFT JOIN нельзя (хотя в этом конкретном - можно)
31 май 17, 21:18    [20529007]     Ответить | Цитировать Сообщить модератору
 Re: NOT EXISTS vs LEFT JOIN  [new]
msLex
Member

Откуда:
Сообщений: 8065
alexeyvg
msLex
пропущено...

хмм, а при каких условиях?
Если object_id в sys.objects неуникально.
Это же просто пример, а не конкретный запрос с этими таблицами.
Т.е. в общем случае заменить EXISTS на LEFT JOIN нельзя (хотя в этом конкретном - можно)
так там же is null
31 май 17, 22:49    [20529202]     Ответить | Цитировать Сообщить модератору
 Re: NOT EXISTS vs LEFT JOIN  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7752
Cammomile,

автор
Это частный случай или экзистс всегда быстрее?


НЕ медленнее.
1 июн 17, 10:58    [20530328]     Ответить | Цитировать Сообщить модератору
 Re: NOT EXISTS vs LEFT JOIN  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Cammomile,

достаточно странное сравнение, всё будет зависеть от многих факторов. Для некоторых случаев и EXCLUDE быстрее будет чем оба названных
1 июн 17, 11:02    [20530349]     Ответить | Цитировать Сообщить модератору
 Re: NOT EXISTS vs LEFT JOIN  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Ну я общую идею имел в виду.
1 июн 17, 11:20    [20530451]     Ответить | Цитировать Сообщить модератору
 Re: NOT EXISTS vs LEFT JOIN  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Cammomile
Ну я общую идею имел в виду.

общая идею - хрень :)
1 июн 17, 11:30    [20530509]     Ответить | Цитировать Сообщить модератору
 Re: NOT EXISTS vs LEFT JOIN  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31354
msLex
alexeyvg
пропущено...
Если object_id в sys.objects неуникально.
Это же просто пример, а не конкретный запрос с этими таблицами.
Т.е. в общем случае заменить EXISTS на LEFT JOIN нельзя (хотя в этом конкретном - можно)
так там же is null
А, ну да, я EXISTS имел в виду, не заметил...
1 июн 17, 15:29    [20531780]     Ответить | Цитировать Сообщить модератору
 Re: NOT EXISTS vs LEFT JOIN  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
alexeyvg
msLex
пропущено...
так там же is null
А, ну да, я EXISTS имел в виду, не заметил...
А если на NULL проверяется поле, которое может просто иметь значение NULL?
Без участия LEFT JOIN, так сказать.
Тогда LEFT JOIN может вернуть несколько записей для одной из тлевой таблицы,
а NOT EXISTS в принципе не может увеличить количество записей.
Это в общем случае, разумеется.
1 июн 17, 15:33    [20531795]     Ответить | Цитировать Сообщить модератору
 Re: NOT EXISTS vs LEFT JOIN  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31354
iap
А если на NULL проверяется поле, которое может просто иметь значение NULL?
Ну естественно, нужно проверять на NULL ПК той таблицы, которая лефт джойн. Это само собой разумеется, если заменяем NOT EXISTS на LEFT JOIN

Другое дело, что вообще идея заменять NOT EXISTS неправильная. Он специально для этого предназначен, он точно будет работать не хуже, и точно не ошибёшся.
1 июн 17, 15:36    [20531810]     Ответить | Цитировать Сообщить модератору
 Re: NOT EXISTS vs LEFT JOIN  [new]
msLex
Member

Откуда:
Сообщений: 8065
iap
А если на NULL проверяется поле, которое может просто иметь значение NULL?

так в этом запросе проверяется поле, являющийся ключом JOIN-а, и я не могу представить ситуацию, когда эти два запроса могут вернуть разные данные (даже если все поля в этих "таблицах" не уникальные и могут содержать null)
1 июн 17, 17:05    [20532276]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить