Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 outer apply vs left join  [new]
^^^^
Guest
коллеги,
услышал на собеседовании, что
outer apply работает быстрее left join. Так ли это, есть какие-нибудь статьи на этот счет?
4 июл 16, 12:43    [19366457]     Ответить | Цитировать Сообщить модератору
 Re: outer apply vs left join  [new]
aleks2
Guest
Вот на заборе написано "Х...", а лежат дрова.

ЗЫ. Неучи тя собеседовали.
4 июл 16, 12:49    [19366480]     Ответить | Цитировать Сообщить модератору
 Re: outer apply vs left join  [new]
Владислав Колосов
Member

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

надо рассматривать конкретные планы запросов. Если бы было так, как Вы пишете при любом раскладе, то одну из реализаций бы убрали.
4 июл 16, 12:52    [19366490]     Ответить | Цитировать Сообщить модератору
 Re: outer apply vs left join  [new]
aleks2
Guest
Владислав Колосов
^^^^,

надо рассматривать конкретные планы запросов. Если бы было так, как Вы пишете при любом раскладе, то одну из реализаций бы убрали.

Ну вот, яркий пример оного.
Inner Join при любом раскладе не медленней outer apply.
Просто, при некоторых раскладах Inner Join неприменим.
4 июл 16, 12:55    [19366503]     Ответить | Цитировать Сообщить модератору
 Re: outer apply vs left join  [new]
Pavel1211
Member

Откуда: Екатеринбург
Сообщений: 205
aleks2,

никто и не говорит про внутреннее соединение.
В вопросе ТС - внешнее.

Вы в своем репертуаре.
4 июл 16, 12:57    [19366507]     Ответить | Цитировать Сообщить модератору
 Re: outer apply vs left join  [new]
^^^^
Guest
Владислав Колосов,

Это понятно, но вот хотелось бы узнать (проверить) так ли это и какой прирост это дает.
Я примера придумать не могу
4 июл 16, 13:00    [19366520]     Ответить | Цитировать Сообщить модератору
 Re: outer apply vs left join  [new]
aleks2
Guest
Pavel1211
aleks2,

никто и не говорит про внутреннее соединение.
В вопросе ТС - внешнее.

Вы в своем репертуаре.

Читай вместо Inner - Left.
Пардон, описался.
4 июл 16, 13:01    [19366533]     Ответить | Цитировать Сообщить модератору
 Re: outer apply vs left join  [new]
aleks2
Guest
^^^^
Владислав Колосов,

Это понятно, но вот хотелось бы узнать (проверить) так ли это и какой прирост это дает.
Я примера придумать не могу

Прежде, чем "проверять", нехудо бы подучиться.
Ибо нема у outer apply чудесного способа соединения таблиц.
А если алгоритм соединения одинаков - откуда возмется преимущество?
4 июл 16, 13:04    [19366548]     Ответить | Цитировать Сообщить модератору
 Re: outer apply vs left join  [new]
iap
Member

Откуда: Москва
Сообщений: 47085
Неоднократно получал обратный эффект.
LEFT JOIN лучше
4 июл 16, 13:11    [19366591]     Ответить | Цитировать Сообщить модератору
 Re: outer apply vs left join  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37228
aleks2
Вот на заборе написано "Х...", а лежат дрова.

ЗЫ. Неучи тя собеседовали.
Почему сразу неучи? Может, скажем так, троллили, и ждали, что кандидат опровергнет.
4 июл 16, 13:21    [19366644]     Ответить | Цитировать Сообщить модератору
 Re: outer apply vs left join  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4832
^^^^
коллеги,
услышал на собеседовании, что
outer apply работает быстрее left join. Так ли это, есть какие-нибудь статьи на этот счет?


Если это сформулировать вот так, то ответ -- это полная чушь.

Могут "быть случаи", когда outer apply работает лучше left join.

Например OUTER APPLY ( SELECT TOP 1 ) может оказаться лучше LEFT JOIN WHERE ROW_NUMBER() = 1
4 июл 16, 15:20    [19367239]     Ответить | Цитировать Сообщить модератору
 Re: outer apply vs left join  [new]
Megabyte
Member

Откуда: ближайшее заМКАДье
Сообщений: 4995
^^^^
коллеги,
услышал на собеседовании, что
outer apply работает быстрее left join. Так ли это, есть какие-нибудь статьи на этот счет?

А вы в какой роли были: собеседующий или собеседуемый? :)

з.ы. интересно просто, кто ляпнул подобное без указания конкретного запроса...
4 июл 16, 17:09    [19367849]     Ответить | Цитировать Сообщить модератору
 Re: outer apply vs left join  [new]
o-o
Guest
Megabyte
^^^^
коллеги,
услышал на собеседовании, что
outer apply работает быстрее left join. Так ли это, есть какие-нибудь статьи на этот счет?

А вы в какой роли были: собеседующий или собеседуемый? :)

з.ы. интересно просто, кто ляпнул подобное без указания конкретного запроса...

вариант 3) подслушивал под дверью
при таком развитии событий звук есть, видео нет,
а еще могла быть лишь заключительная часть сериала.
поэтому был ли там конкретный запрос подслушивающему неизвестно
4 июл 16, 17:14    [19367879]     Ответить | Цитировать Сообщить модератору
 Re: outer apply vs left join  [new]
^^^^
Guest
Megabyte,

собеседуемый
4 июл 16, 17:17    [19367902]     Ответить | Цитировать Сообщить модератору
 Re: outer apply vs left join  [new]
^^^^
Guest
a_voronin
Например OUTER APPLY ( SELECT TOP 1 ) может оказаться лучше LEFT JOIN WHERE ROW_NUMBER() = 1


Ну а пример приведете?
4 июл 16, 17:18    [19367904]     Ответить | Цитировать Сообщить модератору
 Re: outer apply vs left join  [new]
^^^^
Guest
aleks2
Владислав Колосов
^^^^,

надо рассматривать конкретные планы запросов. Если бы было так, как Вы пишете при любом раскладе, то одну из реализаций бы убрали.

Ну вот, яркий пример оного.
Inner Join при любом раскладе не медленней outer apply.
Просто, при некоторых раскладах Inner Join неприменим.


Видимо все-таки собеседующий имел в виду inner join и outer apply, но оговорился
4 июл 16, 17:32    [19367955]     Ответить | Цитировать Сообщить модератору
 Re: outer apply vs left join  [new]
iap
Member

Откуда: Москва
Сообщений: 47085
^^^^
aleks2
пропущено...

Ну вот, яркий пример оного.
Inner Join при любом раскладе не медленней outer apply.
Просто, при некоторых раскладах Inner Join неприменим.


Видимо все-таки собеседующий имел в виду inner join и outer apply, но оговорился
Результаты принципиально разные.
Разве можно сравнивать?!
4 июл 16, 17:36    [19367989]     Ответить | Цитировать Сообщить модератору
 Re: outer apply vs left join  [new]
o-o
Guest
^^^^
aleks2
пропущено...

Ну вот, яркий пример оного.
Inner Join при любом раскладе не медленней outer apply.
Просто, при некоторых раскладах Inner Join неприменим.


Видимо все-таки собеседующий имел в виду inner join и outer apply, но оговорился

вообще-то корректно сравнивать inner join / cross apply и left join / outer apply,
они хотя бы в простейшем случае, когда речь просто о двух таблицах, вернут одно и то же
4 июл 16, 17:40    [19368005]     Ответить | Цитировать Сообщить модератору
 Re: outer apply vs left join  [new]
andrey odegov
Member

Откуда:
Сообщений: 473
^^^^
a_voronin
Например OUTER APPLY ( SELECT TOP 1 ) может оказаться лучше LEFT JOIN WHERE ROW_NUMBER() = 1


Ну а пример приведете?
подобное не выполнится - row_number не может находиться в where.
5 июл 16, 09:53    [19369550]     Ответить | Цитировать Сообщить модератору
 Re: outer apply vs left join  [new]
aleks2
Guest
andrey odegov
^^^^
пропущено...


Ну а пример приведете?
подобное не выполнится - row_number не может находиться в where.


Ну, вложенный запрос то не запретишь.
5 июл 16, 09:56    [19369564]     Ответить | Цитировать Сообщить модератору
 Re: outer apply vs left join  [new]
o-o
Guest
andrey odegov,

да понятно, про что он.
в случаях, когда ищут нечто, соответствующее макс.дате.
можно найти макс. и с этим джойнить, можно делать через apply с топом,
можно посчитать всем роу намберы и отфильтровать с первым.
задача-то одна, решений много,
но джойн в первом и apply во втором, а воронин вспомнил про третье,
забыв, что там ни джойна, ни apply-я :)
-----------------------------------------------
вот как раз в такой задаче и могут быть варианты.
например, у нас стабильно побеждает вариант с джойном.
да и макс. лучше не подзапросом посчитать, а сохранить во времянку.
тогда он выбирает hash join и результат можно дождаться.
если же использовать топ в apply,
то это неизбежные лупы и результат можно до завтра ждать
5 июл 16, 10:00    [19369581]     Ответить | Цитировать Сообщить модератору
 Re: outer apply vs left join  [new]
o-o
Guest
вот наш классический случай.
2 плана одного и того же, написанного по-разному.
+ query
select  p.datarif,
		p.CodDpt,
		p.Department,
		p.CodArea,
		p.Aree,
		p.codufficio,
		p.struttura as ufficio,
		p.CodResponsabileStruttura,
		p.[Head_of_Cluster],
		p.CodiceUtenza,
		p.TM_CoordAes_SostResp,
		p.CODRESPINT,
		p.AM_RP,
		p.DAARCHIVIARE,
		p.NUM_PRAT,
		p.NDG,
		PD.codproposta,
		PD.dataproposta,
		PD.tipodelibera,
		PD.importo_proposto_t,
		PD.data_rigiroamandante,
		p.CC,
		p.SC,
		p.IDBanca,
		p.Mandante
into #t1		
from dbo.M_A_DEPARTMENT_PRATICHE_T as p with(nolock)
	 inner join [CORESQL7].dbo.PROPOSTE_DI_DELIBERA as PD
		on p.NUM_PRAT = PD.NUM_PRAT          
	 inner join (select NUM_PRAT,
				        max(CODPROPOSTA) as MAX_CODPROPOSTA
			     from [CORESQL7].dbo.PROPOSTE_DI_DELIBERA
			     group by NUM_PRAT) as M
        on M.NUM_PRAT = PD.NUM_PRAT
       and M.MAX_CODPROPOSTA = PD.CODPROPOSTA
where PD.TIPODELIBERA = 0
  and p.DAARCHIVIARE = 0;
  ----------------------------------------------------------
  
select  p.datarif,
		p.CodDpt,
		p.Department,
		p.CodArea,
		p.Aree,
		p.codufficio,
		p.struttura as ufficio,
		p.CodResponsabileStruttura,
		p.[Head_of_Cluster],
		p.CodiceUtenza,
		p.TM_CoordAes_SostResp,
		p.CODRESPINT,
		p.AM_RP,
		p.DAARCHIVIARE,
		p.NUM_PRAT,
		p.NDG,
		PD.codproposta,
		PD.dataproposta,
		PD.tipodelibera,
		PD.importo_proposto_t,
		PD.data_rigiroamandante,
		p.CC,
		p.SC,
		p.IDBanca,
		p.Mandante
into #t2		
from dbo.M_A_DEPARTMENT_PRATICHE_T as p with(nolock)
	 cross apply(select top 1 codproposta,
							dataproposta,
							tipodelibera,
							importo_proposto_t,
							data_rigiroamandante
			     from [CORESQL7].dbo.PROPOSTE_DI_DELIBERA d
			     where p.NUM_PRAT = d.num_prat
			     order by CODPROPOSTA desc) as pd
where PD.TIPODELIBERA = 0
  and p.DAARCHIVIARE = 0;

вариант с хэшем бьет лупы по всем показателям.
это актуальные планы.
причем индексы уж какие есть, такие и есть, ибо coresql7 это ридонли база,
восстанавливаемая каждую ночь с OLTP-сервера.
так что без вариантов, ничего в той базе менять нельзя.
и это цветочки, т.к. строк мало.
только дело ж не в join vs apply,
а в том, что внутри этого apply.
например, как у нас, top --> NL

К сообщению приложен файл. Размер - 149Kb
5 июл 16, 14:32    [19371128]     Ответить | Цитировать Сообщить модератору
 Re: outer apply vs left join  [new]
aleks2
Guest
o-o
вот наш классический случай.

Этот "классический случай" - иллюстрация к вопросу "когда apply могет быть эффективнее join".

Если, по факту, все элементы этого запроса:

select NUM_PRAT,  max(CODPROPOSTA) as MAX_CODPROPOSTA
   from [CORESQL7].dbo.PROPOSTE_DI_DELIBERA
   group by NUM_PRAT


задействованы в последующем соединении - join выиграет.

Если только "малая часть" элементов этого запроса - выиграет apply.

Но это еще и от общего числа строк, отбираемого из dbo.M_A_DEPARTMENT_PRATICHE_ зависит.

ЗЫ. Но запрос дурацкий.
6 июл 16, 07:52    [19373531]     Ответить | Цитировать Сообщить модератору
 Re: outer apply vs left join  [new]
o-o
Guest
aleks2
ЗЫ. Но запрос дурацкий.

Типа камешки в мой огород?
Не попал, хозяйство не мое.
Тут просили пример, пример приведен.
А теперь признайся, Альфастрах, все же тебя Васей звать, не так ли?
6 июл 16, 08:47    [19373617]     Ответить | Цитировать Сообщить модератору
 Re: outer apply vs left join  [new]
aleks2
Guest
o-o
aleks2
ЗЫ. Но запрос дурацкий.

Типа камешки в мой огород?
Не попал, хозяйство не мое.
Тут просили пример, пример приведен.
А теперь признайся, Альфастрах, все же тебя Васей звать, не так ли?

Честно признаюсь: зовут не Васей.
6 июл 16, 13:45    [19375254]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить