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

Откуда:
Сообщений: 639
Спрашиваю про использование в конструкции Where.
когда рационально использовать эту агрегатную функцию. Ведь всегда можно обойтись и без нее.
1 окт 09, 15:25    [7730268]     Ответить | Цитировать Сообщить модератору
 Re: Использование Exists  [new]
Glory
Member

Откуда:
Сообщений: 104760
egghead
Спрашиваю про использование в конструкции Where.
когда рационально использовать эту агрегатную функцию. Ведь всегда можно обойтись и без нее.

А давно Exists стала агрегатной функцией ?
И в чем мерять рациональность ?
1 окт 09, 15:27    [7730279]     Ответить | Цитировать Сообщить модератору
 Re: Использование Exists  [new]
egghead
Member

Откуда:
Сообщений: 639
Glory
egghead
Спрашиваю про использование в конструкции Where.
когда рационально использовать эту агрегатную функцию. Ведь всегда можно обойтись и без нее.

А давно Exists стала агрегатной функцией ?
И в чем мерять рациональность ?


Сорри, не агрегатная :)

Рациональность мерить в скорости запроса
1 окт 09, 15:31    [7730307]     Ответить | Цитировать Сообщить модератору
 Re: Использование Exists  [new]
Glory
Member

Откуда:
Сообщений: 104760
egghead

Рациональность мерить в скорости запроса

Ну так померяйте эту скорость на своем запросе
1 окт 09, 15:32    [7730311]     Ответить | Цитировать Сообщить модератору
 Re: Использование Exists  [new]
Влом регистрироваться
Guest
egghead,

когда это выразительно и работает быстрее, чем без нее.
1 окт 09, 15:36    [7730341]     Ответить | Цитировать Сообщить модератору
 Re: Использование Exists  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36814
Влом регистрироваться
egghead,

когда это выразительно и работает быстрее, чем без нее.
А "выразительность" в чем мерять?
1 окт 09, 15:44    [7730415]     Ответить | Цитировать Сообщить модератору
 Re: Использование Exists  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
Гавриленко Сергей Алексеевич
Влом регистрироваться
egghead,

когда это выразительно и работает быстрее, чем без нее.
А "выразительность" в чем мерять?

походу в попугаях... или нет, лучше так: "две половины и ещё половина твоей половины...".
1 окт 09, 15:49    [7730452]     Ответить | Цитировать Сообщить модератору
 Re: Использование Exists  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
egghead
Спрашиваю про использование в конструкции Where.
когда рационально использовать эту агрегатную функцию. Ведь всегда можно обойтись и без нее.

можно примеры- когда можно заменить exists на код с таким же результатом?

зы хотя оптимизатор всё равно приведет большинство кода к семиджойну, но ведь может и не привести.
1 окт 09, 16:06    [7730576]     Ответить | Цитировать Сообщить модератору
 Re: Использование Exists  [new]
Ray D
Member

Откуда: from the middle of nowhere
Сообщений: 3598
Блог
locky
egghead
Спрашиваю про использование в конструкции Where.
когда рационально использовать эту агрегатную функцию. Ведь всегда можно обойтись и без нее.

можно примеры- когда можно заменить exists на код с таким же результатом?


distinct + inner join? ;)
1 окт 09, 16:08    [7730598]     Ответить | Цитировать Сообщить модератору
 Re: Использование Exists  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Ray D
distinct + inner join? ;)

Вам сразу рассказать, чем дистинкт+джойн хуже, чем exists, или помучать?
1 окт 09, 16:09    [7730605]     Ответить | Цитировать Сообщить модератору
 Re: Использование Exists  [new]
Ray D
Member

Откуда: from the middle of nowhere
Сообщений: 3598
Блог
Вы пример спросили? :)

Сплошь и рядом.
Вот только сегодня спрашивали, почему это вдруг тормозит:

SELECT DISTINCT cfp.assignmentsubmissionid FROM
 {$CFG->prefix}crot_fingerprint cfp WHERE cfp.value IN (SELECT cp.value FROM
 {$CFG->prefix}crot_fingerprint cp WHERE cp.assignmentsubmissionid = $docid)
 AND cfp.assignmentsubmissionid != $docid
1 окт 09, 16:12    [7730627]     Ответить | Цитировать Сообщить модератору
 Re: Использование Exists  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Ray D
Вы пример спросили? :)

ага.
я то сам в принципе могу обойтись только джойнами и дистинктом - без групбаев, эксистов, инов и прочих плюшек - но возникает вопрос - надо ли мне без них обходится?
И второй вопрос, вдогонку к моему предыдущему (на случай, если таки ответят, почему exists лучше join distinct).
А почему join distinct лучше чем exists?

надо будет записать в неоднозначные вопросы на собеседование.
1 окт 09, 16:16    [7730649]     Ответить | Цитировать Сообщить модератору
 Re: Использование Exists  [new]
Сергей Мишин
Member

Откуда:
Сообщений: 376
locky
Ray D
distinct + inner join? ;)

Вам сразу рассказать, чем дистинкт+джойн хуже, чем exists, или помучать?


DECLARE @a TABLE (a int PRIMARY KEY)
DECLARE @b TABLE (b int)

INSERT @a SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
INSERT @b SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 3

SELECT DISTINCT
	a
FROM @a
	JOIN @b ON a=b

SELECT
	a
FROM
	@a
WHERE
	EXISTS(SELECT 1 FROM @b WHERE a=b)
и чем дистинкт+джойн хуже, чем exists?
1 окт 09, 16:26    [7730734]     Ответить | Цитировать Сообщить модератору
 Re: Использование Exists  [new]
Ray D
Member

Откуда: from the middle of nowhere
Сообщений: 3598
Блог
locky
.
А почему join distinct лучше чем exists?

Чего-то сходу нет вариантов.
1 окт 09, 16:27    [7730740]     Ответить | Цитировать Сообщить модератору
 Re: Использование Exists  [new]
vino
Member

Откуда:
Сообщений: 1191
Сергей Мишин
...
DECLARE @a TABLE (a int PRIMARY KEY)
...
SELECT DISTINCT
a
FROM @a
...
и чем дистинкт+джойн хуже, чем exists?

в указанном случае distinct бессмысленен, так что это не пример
а exists лучше хотя бы тем, что прекращает поиск на первой найденной записи, а join отрабатывает все подходящие условию
1 окт 09, 16:37    [7730811]     Ответить | Цитировать Сообщить модератору
 Re: Использование Exists  [new]
vino
Member

Откуда:
Сообщений: 1191
Сергей Мишин, хотя насчет distinct я погорячился, звиняйте
1 окт 09, 16:40    [7730849]     Ответить | Цитировать Сообщить модератору
 Re: Использование Exists  [new]
vino
Member

Откуда:
Сообщений: 1191
но distinct расходует ресурсы на проверку уникальности выбираемого значения
1 окт 09, 16:41    [7730865]     Ответить | Цитировать Сообщить модератору
 Re: Использование Exists  [new]
Ray D
Member

Откуда: from the middle of nowhere
Сообщений: 3598
Блог
Для примера Сергея планы одинаковые
1 окт 09, 16:48    [7730914]     Ответить | Цитировать Сообщить модератору
 Re: Использование Exists  [new]
Ray D
Member

Откуда: from the middle of nowhere
Сообщений: 3598
Блог
ну то есть тут оптимизатор сам сумничал и привел запрос к exists (semi-join). а мог бы и ступить.
1 окт 09, 16:52    [7730941]     Ответить | Цитировать Сообщить модератору
 Re: Использование Exists  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Сергей Мишин
и чем дистинкт+джойн хуже, чем exists?

Попробуйте на табличках с несколько большим к-вом записей.

create table a(id int)
go
create clustered index cl on a(id)
go
create table b(id int not null)
go
create clustered index cl on b(id)
go

insert into a(id) select object_id from sys.objects
go
insert into b(id) select a.object_id from sys.columns a cross join sys.tables b
go

--select count(*) from b
--~200k
set statistics io on
set statistics time on
SELECT DISTINCT
	a.id
FROM a
	JOIN b ON a.id=b.id


SELECT
	a.id
FROM
	a
WHERE
	EXISTS(SELECT * FROM b WHERE a.id=b.id)
go
drop index cl on b
go

SELECT a.id
FROM a	JOIN (select distinct id from b) b ON a.id=b.id

SELECT DISTINCT
	a.id
FROM a
	JOIN b ON a.id=b.id


SELECT
	a.id
FROM
	a
WHERE
	EXISTS(SELECT * FROM b WHERE a.id=b.id)

кстати, обратите внимание - ваши два запроса - вообще говоря не эквивалентны.

Ray D, см. пример, где по таблице b нет индекса.
1 окт 09, 17:07    [7731057]     Ответить | Цитировать Сообщить модератору
 Re: Использование Exists  [new]
Сергей Мишин
Member

Откуда:
Сообщений: 376
locky,
как раз мои два запроса эквивалентны в моём примере-)))
SELECT DISTINCT
	a.id
FROM a
	JOIN b ON a.id=b.id


SELECT
	a.id
FROM
	a
WHERE
	EXISTS(SELECT * FROM b WHERE a.id=b.id)
В вашем примере запросы будут эквивалентен при create UNIQUE clustered index cl on a(id). Попробуйте и сравните планы выполнения.

P/S: Мы сравниваем "дистинкт+джойн с exists" или "джойн(селект дистинкт) с exists" ?
1 окт 09, 17:25    [7731157]     Ответить | Цитировать Сообщить модератору
 Re: Использование Exists  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Сергей Мишин
locky,
как раз мои два запроса эквивалентны в моём примере-)))
В вашем примере запросы будут эквивалентен при create UNIQUE clustered index cl on a(id). Попробуйте и сравните планы выполнения.

P/S: Мы сравниваем "дистинкт+джойн с exists" или "джойн(селект дистинкт) с exists" ?

В вашем примере - да, поэтому я и написал "вообще говоря".
пробовал. сравнивал. знаю.

сравниваем и то и другое (имея на уме, что дистинкт джойн и джойн дистинкт - вообще говоря неэквивалетны).
1 окт 09, 17:29    [7731182]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить