Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Что лучше: IN () или EXISTS() ?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
в таком случае, что лучше? в #temp1 до 100000, в #temp2 до 100 записей может быть...
в t3 десятки миллионов..


UPDATE	t3 SET flag = flag+1 
where [id] in 
(select id from #temp1
	union ALL
	select id from #temp2)

DELETE FROM t2 
WHERE id  in 
(select id from #temp1
	union ALL
	select id from #temp2)
3 июн 13, 11:52    [14382836]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше: IN () или EXISTS() ?  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
и часто Вам нужно удалять десятки миллионов записей?
3 июн 13, 11:55    [14382861]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше: IN () или EXISTS() ?  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
http://sqlinthewild.co.za/index.php/2009/08/17/exists-vs-in/
3 июн 13, 12:06    [14382952]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше: IN () или EXISTS() ?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Паганель
и часто Вам нужно удалять десятки миллионов записей?


в t2 не десятки млн, там << к-ва в тех двух временных.
апдейт t3 делается тоже для к-ва записей, которые во временных таблицах.
3 июн 13, 12:12    [14383002]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше: IN () или EXISTS() ?  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
А вообще люди говорят, что в общем оптимизатор разворачивает ИН в экзисты. Т.е. вопрос "что лучше" не сильно актуален.
3 июн 13, 12:17    [14383043]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше: IN () или EXISTS() ?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Причем здесь лучше/хуже?
Смотрите план - там всё расписано...
3 июн 13, 12:19    [14383064]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше: IN () или EXISTS() ?  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
(Ожидаемо) одинаковые планы.

SELECT * FROM  sys.objects WHERE [object_id] IN (SELECT [object_id] FROM sys.tables )

SELECT * FROM  sys.objects so WHERE EXISTS (SELECT * FROM sys.tables st WHERE st.[object_id] = so.[object_id]  )
3 июн 13, 12:25    [14383130]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше: IN () или EXISTS() ?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Cammomile
(Ожидаемо) одинаковые планы.
Ну и о чем тогда спор?
3 июн 13, 12:31    [14383178]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше: IN () или EXISTS() ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47083
tpg
Cammomile
(Ожидаемо) одинаковые планы.
Ну и о чем тогда спор?
EXISTS() более универсален, правда же?
По крайней мере до появления в MSSQL векторных операций сравнения.
Да и после этого, вобщем, тоже.
3 июн 13, 12:38    [14383235]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше: IN () или EXISTS() ?  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Да нет никакого спора.

ИН, как я понимаю, хорош когда мы идем по статическому "списку". Типа [Id] IN (1, 2, 3).
3 июн 13, 12:42    [14383266]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше: IN () или EXISTS() ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47083
Cammomile
Да нет никакого спора.

ИН, как я понимаю, хорош когда мы идем по статическому "списку". Типа [Id] IN (1, 2, 3).
В этом случае оптимизатор этот список тупо раскрывает в операторы OR.
Ничего хорошего, в общем.
3 июн 13, 12:57    [14383378]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше: IN () или EXISTS() ?  [new]
Andrey Sribnyak
Member

Откуда: Киев
Сообщений: 599
Winnipuh,

Очень часто на очень больших подзапросах IN не сможет выполниться , а будет валиться с ошибкой, что не смогла построить план выполнения.
Поэтому альтернативы exists здесь нет
3 июн 13, 13:15    [14383526]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше: IN () или EXISTS() ?  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
iap, а чем это плохо, если серия OR соответсвует логике написания? Т.е. фактически мне же нужно именно это. Почему тогда плохо ?
3 июн 13, 13:29    [14383604]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше: IN () или EXISTS() ?  [new]
Andrey Sribnyak
Member

Откуда: Киев
Сообщений: 599
Andrey Sribnyak,

Это кстати описано в документации:

http://msdn.microsoft.com/en-us/library/ms177682.aspx

Including an extremely large number of values (many thousands) in an IN clause can consume resources and return errors 8623 or 8632. To work around this problem, store the items in the IN list in a table.

Error 8623:

The query processor ran out of internal resources and could not produce a query plan. This is a rare event and only expected for extremely complex queries or queries that reference a very large number of tables or partitions. Please simplify the query. If you believe you have received this message in error, contact Customer Support Services for more information.

Error 8632:

Internal error: An expression services limit has been reached. Please look for potentially complex expressions in your query, and try to simplify them.
3 июн 13, 13:30    [14383610]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше: IN () или EXISTS() ?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Блин. Тема подымалась сотни раз.

iap
Cammomile
ИН хорош когда мы идем по статическому "списку". Типа [Id] IN (1, 2, 3).
В этом случае оптимизатор этот список тупо раскрывает в операторы OR.
Ничего хорошего, в общем.
Ну дык причём тут "Ничего хорошего", логически эквивалентно, тчк.
А вот "повезло/не повезло" с задачей в котором есть OR (заданных как логика задачи) это вообще непонятный разговор.
Как всё плохо в личной жизни - солнце зелёное.
И скуль же может OR нормально в SEEK впендёрить. Зашибись же.

Cammomile
(Ожидаемо) одинаковые планы.
Ожидаемо? Это тут ожидаемо. Для других случаев "неожидаемо хреновые планы".

Я не думаю что у скуль может не статический IN впендёрить в нецикловой SEEK там, и поймёт что вывернуть надо всё наизнанку.
Это же надо обычный последовательный FROM завернуть в WHERE?! Надо чтобы логика задачи была написана понятно.
;WITH [Temp] AS (
	SELECT ID FROM #temp1
UNION ALL
	SELECT ID FROM #temp2
)
UPDATE	T
SET	Flag += 1 
FROM	[Temp]	S
JOIN	dbo.T3	T ON T.ID = S.ID
Если вам фиолетово что такое логически понятно, и вы оцениваете понятливость ситуационно-обывательски.
Засуньте своё мнение кое куда - оно бессмысленно и очевидно. Не вам описывать принципы форматирования и описания.

Если ID обоих #temp пересекаются - то руки оторвать за UNION ALL.
3 июн 13, 13:49    [14383727]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше: IN () или EXISTS() ?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Mnior
Блин. Тема подымалась сотни раз.

iap
пропущено...
В этом случае оптимизатор этот список тупо раскрывает в операторы OR.
Ничего хорошего, в общем.
Ну дык причём тут "Ничего хорошего", логически эквивалентно, тчк.
А вот "повезло/не повезло" с задачей в котором есть OR (заданных как логика задачи) это вообще непонятный разговор.
Как всё плохо в личной жизни - солнце зелёное.
И скуль же может OR нормально в SEEK впендёрить. Зашибись же.

Cammomile
(Ожидаемо) одинаковые планы.
Ожидаемо? Это тут ожидаемо. Для других случаев "неожидаемо хреновые планы".

Я не думаю что у скуль может не статический IN впендёрить в нецикловой SEEK там, и поймёт что вывернуть надо всё наизнанку.
Это же надо обычный последовательный FROM завернуть в WHERE?! Надо чтобы логика задачи была написана понятно.
;WITH [Temp] AS (
	SELECT ID FROM #temp1
UNION ALL
	SELECT ID FROM #temp2
)
UPDATE	T
SET	Flag += 1 
FROM	[Temp]	S
JOIN	dbo.T3	T ON T.ID = S.ID
Если вам фиолетово что такое логически понятно, и вы оцениваете понятливость ситуационно-обывательски.
Засуньте своё мнение кое куда - оно бессмысленно и очевидно. Не вам описывать принципы форматирования и описания.

Если ID обоих #temp пересекаются - то руки оторвать за UNION ALL.


не должны пересекаться.. а за что "руки"?
я избавился от distinct, зачем лишняя нагрузка?
3 июн 13, 14:33    [14383987]     Ответить | Цитировать Сообщить модератору
 Re: Что лучше: IN () или EXISTS() ?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Winnipuh
не должны пересекаться..
Это как подтвердили?
Избавиться можно констраинтами. Согласен, что можно конечно оставить UNION - всё равно Merge дешёвый. Но это запутывать логику.
Winnipuh
я избавился от distinct, зачем лишняя нагрузка?
Старый добрый semi-джоин?
А кто сказал что он только на Exists реагирует? (см картинку)
Distinct это конечно хорошо, но LOOP + SEEK не дешевле Merge, порой очень сильно.

От логики задачи не избавиться.

К сообщению приложен файл. Размер - 20Kb
4 июн 13, 02:24    [14386850]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить