Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Почему Exists вместо IN? / 8 сообщений из 8, страница 1 из 1
20.06.2002, 23:25:00
    #32033404
Cyclope
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему Exists вместо IN?
Почему в подзапросах лучше применять EXISTS вместо IN?
Верно ли утверждение что SQL сервер прекращает извлечение множества результатов, удовлетворяющему условию WHERE в подзапросе, если хотя бы одна строка удовлетворяет условию, что и достигается использованием оператора EXISTS.

Заранее благодарен.
...
Рейтинг: 0 / 0
20.06.2002, 23:52:16
    #32033406
klama
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему Exists вместо IN?
должен выпрыгивать как только встретит искомое значение в первый раз.
...
Рейтинг: 0 / 0
21.06.2002, 10:32:17
    #32033438
ddd
ddd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему Exists вместо IN?
Да, вроде бы в книге так написано. IN вообще надо стараться использовать как можно реже. Вложенные запросы очень ресурсоемки.
...
Рейтинг: 0 / 0
21.06.2002, 11:58:51
    #32033457
Dankov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему Exists вместо IN?
> Верно ли утверждение что SQL сервер прекращает извлечение множества результатов...

Для sql2000 верно, для sql7.0 не верно.

Оптимизатор sql7.0 выражения EXISTS и IN нагло преобразует к JOIN с последующим фильтром дублей, поэтому на семерке EXISTS и IN абсолютно одинаковы по эффективности.
...
Рейтинг: 0 / 0
21.06.2002, 20:30:24
    #32033518
Sergey Makarov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему Exists вместо IN?
Так что, уважаемые знатоки - нужно ли мне быстренько переписывать подзапросы IN на EXISTS в SQL2000 ?
...
Рейтинг: 0 / 0
21.06.2002, 21:50:30
    #32033521
Sergey Makarov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему Exists вместо IN?
Код: plaintext
1.
2.
SELECT CommItemID FROM CommItem 
WHERE CommItemID IN 
(SELECT CommItemID FROM CommSplitItem)


Код: plaintext
1.
SELECT CommItemID FROM CommItem a 
WHERE EXISTS (SELECT b.CommItemID FROM CommSplitItem b WHERE a.CommItemID=b.CommItemID)


Два запроса - и совершенно одинаковые execution планы.
Так есть ли разница между IN и EXISTS в MSSQL2000?
...
Рейтинг: 0 / 0
22.06.2002, 12:30:27
    #32033533
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему Exists вместо IN?
Я думаю, что все еще зависит от того запроса, который обрабатывается в IN или EXISTS. Пример:

Код:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
create table #Test 
(SaveDate smalldatetime not null, 
 CalcDate smalldatetime not null, 
 Group_id int not null, 
 Value int not null
 constraint PK_Test primary key (SaveDate, CalcDate, Group_id))

insert into #Test values ('20020101', '20020101', 1, 100)
insert into #Test values ('20020201', '20020101', 1, 150)
insert into #Test values ('20020201', '20020201', 1, 200)

-- 1: use IN Cost: 0.0490
select SaveDate, CalcDate, Group_id, Value
from #Test t
where SaveDate in 
(select Max(SaveDate) from #Test tt
 where tt.CalcDate = t.CalcDate and
 tt.Group_id = t.Group_id)

-- 2: use EXISTS Cost: 0.0754
select SaveDate, CalcDate, Group_id, Value
from #Test t
where Exists(
select * from #Test tt
where tt.CalcDate = t.CalcDate and
tt.Group_id = t.Group_id
having Max(tt.SaveDate) = t.SaveDate)

-- 3: use INNER JOIN Cost 0.0490
select t.SaveDate, t.CalcDate, t.Group_id, t.Value
from #Test t
inner join
(select CalcDate, Group_id, Max(SaveDate) as SaveDate
 from #Test
 group by CalcDate, Group_id) as tt 
on t.SaveDate = tt.SaveDate and 
t.CalcDate = tt.CalcDate and 
t.Group_id = tt.Group_id


drop table #Test


Как видно из теста использование агрегатных функций на данном примере (я бы не сказал идеально - придумать на ходу ситуацию сложно) тормозит запрос 2 (EXISTS), причем план у него получается не кислый по сравнению (кстати одинаковыми) с планами 1 и 3 запросов. Я во всяком случае привык в SQL только к одному - никаких аксиом и ориентация только на план.
...
Рейтинг: 0 / 0
22.06.2002, 15:28:02
    #32033540
Dankov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему Exists вместо IN?
Есть ситуации, когда варианты запросов с IN, EXISTS или JOIN совершенно идентичны по сути. Вот в таких ситуациях MSSQL2000 и генерит одинаковые планы.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Почему Exists вместо IN? / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]