Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Когда join не получится использовать вместо exists?  [new]
anc32
Member

Откуда: Кострома
Сообщений: 146
Опишите, пожалуйста, такие случаи.
21 апр 16, 19:32    [19090388]     Ответить | Цитировать Сообщить модератору
 Re: Когда join не получится использовать вместо exists?  [new]
iljy
Member

Откуда:
Сообщений: 8711
anc32
Опишите, пожалуйста, такие случаи.


Не бывает таких, потому что в плане exists в конце концов сводится к MERGE-LOOP-HASH - операторам. Варианты могут быть связаны с количеством записей - exists не делает дублей записей, а join может, так что могут потребоваться дополнительные ухищрения.


А откуда вопрос-то такой взялся?
21 апр 16, 19:54    [19090462]     Ответить | Цитировать Сообщить модератору
 Re: Когда join не получится использовать вместо exists?  [new]
TaPaK
Member

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

вариант наверное с множителем строк, как пишет iljy, но это при том что весь остальной запрос должен быть как и с Exists (без distinct/group by)
Наверно ещё OR NOT EXISTS... но голова уже не варит

А откуда вопрос-то такой взялся?

поддерживаю вопрос
21 апр 16, 20:02    [19090488]     Ответить | Цитировать Сообщить модератору
 Re: Когда join не получится использовать вместо exists?  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
TaPaK
iljy,

вариант наверное с множителем строк, как пишет iljy, но это при том что весь остальной запрос должен быть как и с Exists (без distinct/group by)
Наверно ещё OR NOT EXISTS... но голова уже не варит

А откуда вопрос-то такой взялся?

поддерживаю вопрос
Вопрос с экзамена по РСУБД
21 апр 16, 20:32    [19090573]     Ответить | Цитировать Сообщить модератору
 Re: Когда join не получится использовать вместо exists?  [new]
TaPaK
Member

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

онлайн что ли? или теперь дают время на подумать :)
21 апр 16, 20:33    [19090578]     Ответить | Цитировать Сообщить модератору
 Re: Когда join не получится использовать вместо exists?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4832
TaPaK,

			DELETE FROM target
			FROM [Facts].[SHK_PredOrder_Invoice_GI] target
			WHERE 
				EXISTS (SELECT TOP 1 1 FROM @A F1 WHERE 
					target.[SHK_DeletedData_SHK_id] = F1.[SHK_DeletedData_SHK_id]
			)
				OR EXISTS (SELECT TOP 1 1 FROM @B F2 WHERE 
					target.[SHK_PredOrder_Link_id] = F2.[SHK_PredOrder_Link_id]
			)


Вот это кто-то сможет написать через JOIN. Обращаю внимание на OR
21 апр 16, 20:43    [19090605]     Ответить | Цитировать Сообщить модератору
 Re: Когда join не получится использовать вместо exists?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
a_voronin
TaPaK,

			DELETE FROM target
			FROM [Facts].[SHK_PredOrder_Invoice_GI] target
			WHERE 
				EXISTS (SELECT TOP 1 1 FROM @A F1 WHERE 
					target.[SHK_DeletedData_SHK_id] = F1.[SHK_DeletedData_SHK_id]
			)
				OR EXISTS (SELECT TOP 1 1 FROM @B F2 WHERE 
					target.[SHK_PredOrder_Link_id] = F2.[SHK_PredOrder_Link_id]
			)


Вот это кто-то сможет написать через JOIN. Обращаю внимание на OR

LEFT JOIN a
...
LEFT JOIN b
...
WHERE
a.Value IS NOT NULL OR b.Value IS NOT NULL
но это я уже пиво выпил, могу быть не прав
21 апр 16, 20:47    [19090612]     Ответить | Цитировать Сообщить модератору
 Re: Когда join не получится использовать вместо exists?  [new]
MKDT
Guest
TaPaK

Вот это кто-то сможет написать через JOIN. Обращаю внимание на OR

LEFT JOIN a
...
LEFT JOIN b
...
WHERE
a.Value IS NOT NULL OR b.Value IS NOT NULL
но это я уже пиво выпил, могу быть не прав[/quot]
Тоже думал про это. Но этот вариант может вернуть больше записей => не замена exists.
21 апр 16, 20:57    [19090635]     Ответить | Цитировать Сообщить модератору
 Re: Когда join не получится использовать вместо exists?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
MKDT,7

ммммм это когда оно вернёт больше то? наверху будет как раз все что есть там и там
21 апр 16, 20:59    [19090646]     Ответить | Цитировать Сообщить модератору
 Re: Когда join не получится использовать вместо exists?  [new]
iljy
Member

Откуда:
Сообщений: 8711
a_voronin
TaPaK,
Вот это кто-то сможет написать через JOIN. Обращаю внимание на OR


А в чем проблема-то?

delete t
from [Facts].[SHK_PredOrder_Invoice_GI] t 
 left join (select distinct [SHK_DeletedData_SHK_id] a from @a) F1 on t.[SHK_DeletedData_SHK_id] = a
 left join (select distinct [SHK_PredOrder_Link_id] b from @b) F2 on t.[SHK_PredOrder_Link_id]= b
where isnull(a,b) is not null


PS TOP 1 внутри EXISTS - это от души ;)
21 апр 16, 21:03    [19090654]     Ответить | Цитировать Сообщить модератору
 Re: Когда join не получится использовать вместо exists?  [new]
MKDT
Guest
TaPaK
MKDT,7

ммммм это когда оно вернёт больше то? наверху будет как раз все что есть там и там


(a) y(a)
left join (a)(a) x(a) on y.a=x.a

вернет
(a)
(a)

в exists вернул бы 1 а
21 апр 16, 21:04    [19090658]     Ответить | Цитировать Сообщить модератору
 Re: Когда join не получится использовать вместо exists?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
MKDT
TaPaK
MKDT,7

ммммм это когда оно вернёт больше то? наверху будет как раз все что есть там и там


(a) y(a)
left join (a)(a) x(a) on y.a=x.a

вернет
(a)
(a)

в exists вернул бы 1 а

и дважды удалит? вопрос задвоенности раскрыт в первом комментари
21 апр 16, 21:05    [19090664]     Ответить | Цитировать Сообщить модератору
 Re: Когда join не получится использовать вместо exists?  [new]
TaPaK
Member

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

а что ТОР 1 ???
21 апр 16, 21:07    [19090671]     Ответить | Цитировать Сообщить модератору
 Re: Когда join не получится использовать вместо exists?  [new]
MKDT
Guest
iljy
a_voronin
TaPaK,
Вот это кто-то сможет написать через JOIN. Обращаю внимание на OR


А в чем проблема-то?

PS TOP 1 внутри EXISTS - это от души ;)

План запроса отличается =)
21 апр 16, 21:08    [19090675]     Ответить | Цитировать Сообщить модератору
 Re: Когда join не получится использовать вместо exists?  [new]
TaPaK
Member

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

тю, дошло :) TOP 1 это бывает и
21 апр 16, 21:10    [19090678]     Ответить | Цитировать Сообщить модератору
 Re: Когда join не получится использовать вместо exists?  [new]
iljy
Member

Откуда:
Сообщений: 8711
MKDT
План запроса отличается =)


Добавлением лишнего элемента? ;) да, это повод
21 апр 16, 21:13    [19090689]     Ответить | Цитировать Сообщить модератору
 Re: Когда join не получится использовать вместо exists?  [new]
MKDT
Guest
iljy
MKDT
План запроса отличается =)


Добавлением лишнего элемента? ;) да, это повод

Там большие отличия (6 операторов против 9). И стоимость в два раза меньше у exists.
21 апр 16, 21:18    [19090704]     Ответить | Цитировать Сообщить модератору
 Re: Когда join не получится использовать вместо exists?  [new]
iljy
Member

Откуда:
Сообщений: 8711
MKDT
Там большие отличия (6 операторов против 9). И стоимость в два раза меньше у exists.


?? репро давайте, очень это странное утверждение.
21 апр 16, 21:38    [19090745]     Ответить | Цитировать Сообщить модератору
 Re: Когда join не получится использовать вместо exists?  [new]
MKDT
Guest
iljy
MKDT
Там большие отличия (6 операторов против 9). И стоимость в два раза меньше у exists.


?? репро давайте, очень это странное утверждение.

SELECT * FROM Schema1.Object1 Object2
WHERE 
EXISTS (SELECT TOP 1 1 FROM Schema1.Object3 Object4 WHERE Object2.Column1=Object4.Column2)
OR
EXISTS (SELECT TOP 1 1 FROM Schema1.Object5 Object6 WHERE Object2.Column3=Object6.Column4)

SELECT  Object2.* FROM Schema1.Object1 Object2
LEFT JOIN  (SELECT DISTINCT Column2 FROM Schema1.Object3) Object4 ON Object2.Column1=Object4.Column2
LEFT JOIN  (SELECT DISTINCT Column4 FROM Schema1.Object5) Object6 ON Object2.Column3=Object6.Column4
where ISNULL(Object6.Column4,Object4.Column2) is not NULL
21 апр 16, 21:47    [19090763]     Ответить | Цитировать Сообщить модератору
 Re: Когда join не получится использовать вместо exists?  [new]
MKDT
Guest


К сообщению приложен файл. Размер - 44Kb
21 апр 16, 21:48    [19090766]     Ответить | Цитировать Сообщить модератору
 Re: Когда join не получится использовать вместо exists?  [new]
MKDT
Guest


К сообщению приложен файл (Plan_Anonymized.queryanalysis - 20Kb) cкачать
21 апр 16, 21:48    [19090768]     Ответить | Цитировать Сообщить модератору
 Re: Когда join не получится использовать вместо exists?  [new]
iljy
Member

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

эмммм.... вы вообще что с чем сравниваете??? Ясный пень, JOIN+DISTINCT легко даст гораздо менее эффективный план, чем EXISTS, просто потому, что у EXISTS выбор вариантов будет сильно больше. Я-то говорил исключительно про использование TOP 1 внутри EXISTS, который в принципе существование только одной записи проверяет. Уберите из первого запроса топы и посмотрите, изменится что-нибудь или нет.
21 апр 16, 22:01    [19090796]     Ответить | Цитировать Сообщить модератору
 Re: Когда join не получится использовать вместо exists?  [new]
TaPaK
Member

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

то он переусердствовал :)
21 апр 16, 22:02    [19090799]     Ответить | Цитировать Сообщить модератору
 Re: Когда join не получится использовать вместо exists?  [new]
iljy
Member

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

да я уж вижу
21 апр 16, 22:03    [19090802]     Ответить | Цитировать Сообщить модератору
 Re: Когда join не получится использовать вместо exists?  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1832
Как предикат, EXISTS не обязан возвращать результирующий набор, он возвращает значение "истина" или "ложь" в зависимости от того, возвращает ли запрос какие-либо строки. По этой причине оптимизатор запросов SQL Server игнорирует список SELECT в запросе, и поэтому что бы вы ни указали, это не повлияет на варианты оптимизации, такие как выбор индекса.
Поэтому в EXISTS всегда пишу SELECT * FROM и не парюсь.
21 апр 16, 22:12    [19090828]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить