powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Сравнение loop join с hasj join
38 сообщений из 38, показаны все 2 страниц
Сравнение loop join с hasj join
    #39576565
Prolog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
запрос с loop join
Код: sql
1.
2.
3.
4.
5.
select i.name,t.name from instruments i left loop join assettypes t on t.assettype_id = i.assettype_id option (force order,maxdop 1)/SRC]

результат statistics io:
[src]Table 'AssetTypes'.  Scan count 1, logical reads 101519, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Instruments'. Scan count 1, logical reads    536, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.


3 последовательных результата statistics time:
Код: sql
1.
2.
3.
   CPU time = 297 ms,  elapsed time = 871 ms.
   CPU time = 422 ms,  elapsed time = 894 ms.
   CPU time = 391 ms,  elapsed time = 1030 ms.


запрос с hash join
Код: sql
1.
select i.name,t.name from instruments i left hash join assettypes t on t.assettype_id = i.assettype_id option (force order,maxdop 1)


результат statistics io:
Код: sql
1.
2.
3.
4.
Table 'Workfile'.    Scan count 0, logical reads 0,   physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'.   Scan count 0, logical reads 0,   physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'AssetTypes'.  Scan count 1, logical reads 2,   physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Instruments'. Scan count 1, logical reads 536, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.


3 последовательных результата statistics time:
Код: sql
1.
2.
3.
   CPU time = 109 ms,  elapsed time = 1117 ms.
   CPU time = 109 ms,  elapsed time = 943 ms.
   CPU time = 109 ms,  elapsed time = 959 ms.



В таблице instruments 50759 строк.
В таблице assettypes 11 строк, столбец assettype_id - primary key clustered.

При loop join сканируется таблица instruments и для каждой ее строки считываются по две страницы таблицы assettypes - итого 101519 страницы.
Т.е. для loop join характерно малое значение CPU и большое значение Reads.
При hash join один раз считывается вся таблица assettypes (две страницы), создаетcя hash таблица, в которой прописывается hash ключ и RID строки.
Далее поиск в assettypes производится путем вычисления hash ключа, поиска в RID в hash таблице, и чтения нужной записи.
Т.е. для hash join характерно большее значение значение CPU по сравнению с loop, но меньшее значение Reads.

Однако приведенный пример свидетельстует об обратном: hash join выполняется медленнее и это при том, что кол-во чтений на порядки меньше чем при loop. И, как ни страано, использование CPU при hash три раза меньше, чем при loop.
Почему в этом случае hash медленне чем loop? И почему CPU при hash меньше чем при loop?
...
Рейтинг: 0 / 0
Сравнение loop join с hasj join
    #39576573
dao
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вопрос чисто теоретический или таки какое-то реальное применение есть? ))
...
Рейтинг: 0 / 0
Сравнение loop join с hasj join
    #39576581
Prolog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос возник из-за того, что теория расходится с практикой: кол-во чтений меньше, CPU меньше, а общее время выполнения больше.
Это я замерил и привел пример для опытного запроса на небольших таблицах. В реальных запросах, на больших таблицах - отличия очень существенны. Причем сам оптимизатор выбирает hash join, но при принудительном переводе на loop join время исполнения уменьшается, при том что Read (особенно) и CPU больше.
...
Рейтинг: 0 / 0
Сравнение loop join с hasj join
    #39576587
dao
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
таки вы запускали тесты друг за другом? ))
...
Рейтинг: 0 / 0
Сравнение loop join с hasj join
    #39576590
dao
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и да вы уверены в своих хинтах?))
а то, то что у вас написано очень смахивает на попытку подогнать оптимизатор под, то что вы хотите от него получить, а не то он должен сделать.
...
Рейтинг: 0 / 0
Сравнение loop join с hasj join
    #39576621
Prolog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, запускал друг за другом так, чтобы все данные были закешированы и исключить чтение с диска.
daoи да вы уверены в своих хинтах?))
а то, то что у вас написано очень смахивает на попытку подогнать оптимизатор под, то что вы хотите от него получить, а не то он должен сделать.
Абослютно верно. То, что "должен сделать" оптимизатор, на практике работает медленнее, чем "попытка подогнать оптимизатор под, то что я хоту от него получить".
Так почему при меньшем количестве Reads и CPU соединение с hash выполняется медленнее, чем loop?
...
Рейтинг: 0 / 0
Сравнение loop join с hasj join
    #39576629
Гигабайт Мегабайтович Килобайтов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PrologДа, запускал друг за другом так, чтобы все данные были закешированы и исключить чтение с диска.
daoи да вы уверены в своих хинтах?))
а то, то что у вас написано очень смахивает на попытку подогнать оптимизатор под, то что вы хотите от него получить, а не то он должен сделать.
Абослютно верно. То, что "должен сделать" оптимизатор, на практике работает медленнее, чем "попытка подогнать оптимизатор под, то что я хоту от него получить".
Так почему при меньшем количестве Reads и CPU соединение с hash выполняется медленнее, чем loop?

знавал я одного товарисча - он нафигачит хинтов, а потом разбирайся почему банальнейший запрос вешает нехилый такой сервак ))
"А чо? сейчас то работает быстро! а если станет медленно я другие хинты понаставлю" ))

а теперь повангую - есть некий запрос ( несколько запросов такого типа) в большой процедуре , в котором в where есть условия типа ""(@var1 is null or fields1=@var1) and (@var2 is null or fields2=@var2) and ... и т.д." и вот вы хинтами пытаетесь данный запрос ускорить? ))
...
Рейтинг: 0 / 0
Сравнение loop join с hasj join
    #39576648
Prolog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гигабайт Мегабайтович Килобайтова теперь повангую - есть некий запрос ( несколько запросов такого типа) в большой процедуре , в котором в where есть условия типа ""(@var1 is null or fields1=@var1) and (@var2 is null or fields2=@var2) and ... и т.д." и вот вы хинтами пытаетесь данный запрос ускорить? ))
Такого нет.
Давайте не будем что-то предполагать, а обсуждать в рамках того запроса, который приведён в первом моем посте.
...
Рейтинг: 0 / 0
Сравнение loop join с hasj join
    #39576677
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PrologГигабайт Мегабайтович Килобайтова теперь повангую - есть некий запрос ( несколько запросов такого типа) в большой процедуре , в котором в where есть условия типа ""(@var1 is null or fields1=@var1) and (@var2 is null or fields2=@var2) and ... и т.д." и вот вы хинтами пытаетесь данный запрос ускорить? ))
Такого нет.
Давайте не будем что-то предполагать, а обсуждать в рамках того запроса, который приведён в первом моем посте.

Дык, "для hash join характерно большее значение значение CPU по сравнению с loop, но меньшее значение Reads" - это сферическая истина в вакууме при размере таблиц, стремящемся к бесконечности.

У вас мелкие таблички в памяти.
Со всеми вытекающими.
...
Рейтинг: 0 / 0
Сравнение loop join с hasj join
    #39576684
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Prolog hash join выполняется медленнее и это при том, что кол-во чтений на порядки меньше чем при loop. И, как ни страано, использование CPU при hash три раза меньше, чем при loop.
Почему в этом случае hash медленне чем loop? И почему CPU при hash меньше чем при loop?
Потому что CPU работает не с диском, а с оперативной памятью и с кэшем L3.
Посмотрите под отладчиком процесс MSSQL Server - и Вы увидите, как нерационально в данном конкретном случае идет работа с L3.
Вот почему.
...
Рейтинг: 0 / 0
Сравнение loop join с hasj join
    #39576699
dao
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я не зря спросил в начале - это больше теоретический вопрос или практический.
Потому что с теоретической составляющей - такой вопрос можно повертеть. а с практической вопрос написан не правильно. Отсюда и сомнение в том вы понимаете все хинты которые стоят в данном запросе.
...
Рейтинг: 0 / 0
Сравнение loop join с hasj join
    #39576721
Prolog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
daoя не зря спросил в начале - это больше теоретический вопрос или практический.
Потому что с теоретической составляющей - такой вопрос можно повертеть. а с практической вопрос написан не правильно. Отсюда и сомнение в том вы понимаете все хинты которые стоят в данном запросе.
Напишите, как должен звучать правильно вопрос с практической стороны?
Хорошо, согласен, что не понимаю хинты, которые стоят в запросе. Объясните в чём моя ошибка? Что я не так понимаю?
...
Рейтинг: 0 / 0
Сравнение loop join с hasj join
    #39576725
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Prolog Что я не так понимаю?
Самое главное: ХИНТЫ - АБСОЛЮТНОЕ ЗЛО.

ЗЫ.
Если вы можете не ставить хинты - не ставьте.
Если вы НЕ можете не ставить хинты - не ставьте, все равно.
...
Рейтинг: 0 / 0
Сравнение loop join с hasj join
    #39576736
dao
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вам прям так надо вывести овер 50 к строк? чет очень сомневаюсь
скорей всего есть ещё какие-то условия.

но пускай запрос в лоб - обычный left join и без всяких option, ибо то что написано в option применительно для для данного запроса - чушь.
...
Рейтинг: 0 / 0
Сравнение loop join с hasj join
    #39576741
Prolog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222,
Из области: "Жизнь - абсолютное зло: в её результате наступает смерть".
Зачем-то хинты придумали, и с их помощью запросы работают быстрее. И это факт. Без хинтов и медленно - это абсолютное добро, с хинтами и быстро - это абсолютное зло. Может быть вы просто не умеете ими пользоваться?

Вопрос не про хинты. Вопрос про соединения: "Почему при меньшем количестве Reads и CPU соединение с hash выполняется медленнее, чем loop"? Хинты для того, чтобы получить статистику при разных типах соединений.
...
Рейтинг: 0 / 0
Сравнение loop join с hasj join
    #39576744
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
В таблице instruments 50759 строк.
В таблице assettypes 11 строк


авторinstruments i left loop join assettypes t
0_o
Если ты хинтуешь луп джойн, будь добр слева указать маленькую таблицу, а справа большую. Ну и заодно FORCE ORDER для надежности.
...
Рейтинг: 0 / 0
Сравнение loop join с hasj join
    #39576747
Prolog,

счас придет местный адепт сбора статистики и ребилда индексов и расскажет тебе, где ты неправ и как ускорить твой запрос....

З.Ы.
И тут я буду с ним согласен.... Ты уже статистику пересобрал? Индексы, адексатные твоим условиям отбора и соединения построил? Ничего не помогло? Пошел на крайние меры - использование хинтов?
...
Рейтинг: 0 / 0
Сравнение loop join с hasj join
    #39576753
Prolog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
daoвам прям так надо вывести овер 50 к строк ? чет очень сомневаюсь
скорей всего есть ещё какие-то условия.

но пускай запрос в лоб - обычный left join и без всяких option, ибо то что написано в option применительно для для данного запроса - чушь .

Теперь я понял: это вы не поняли о чём мой вопрос и всё время пытаетесь ответить на какой-то другой.

Тему закрываем. Считаю, что просто loop и hash
...
Рейтинг: 0 / 0
Сравнение loop join с hasj join
    #39576754
Prolog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тему закрываем. Считаю, что просто loop и hash работают как-то не так, как я предполагаю.
...
Рейтинг: 0 / 0
Сравнение loop join с hasj join
    #39576760
Prolog,

давай тогда зайдем с другого конца.... покажи первоисточники, на основании которых ты сделал выводы об алгоритмах работы NL и HJ
...
Рейтинг: 0 / 0
Сравнение loop join с hasj join
    #39576766
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Провел эксперимент.

Код: sql
1.
SELECT .. FROM Users #joint Tickets 


в #USERS 4 записи
в Tickets 250 тысяч

users inner LOOP join 6 % от батча
users inner HASH join 94% от батча

HASH : Scan count 5, logical reads 6565 248 ms
LOOP: Scan count 4, logical reads 609 5ms

Чуда, к счастью, не произошло, всё работает как запланировано.
...
Рейтинг: 0 / 0
Сравнение loop join с hasj join
    #39576767
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222Prolog Что я не так понимаю?
Самое главное: ХИНТЫ - АБСОЛЮТНОЕ ЗЛО.

Абсолютное зло не думать над тем, что делаешь. Хинты полезный, нужный, удобный инструмент, если применять с головой.
...
Рейтинг: 0 / 0
Сравнение loop join с hasj join
    #39576790
Гигабайт Мегабайтович Килобайтов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cammomilealeks222пропущено...

Самое главное: ХИНТЫ - АБСОЛЮТНОЕ ЗЛО.

Абсолютное зло не думать над тем, что делаешь. Хинты полезный, нужный, удобный инструмент, если применять с головой.
после лет 20 программирования - ты присоединишься к темной стороне )))
...
Рейтинг: 0 / 0
Сравнение loop join с hasj join
    #39576806
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гигабайт Мегабайтович КилобайтовCammomileпропущено...

Абсолютное зло не думать над тем, что делаешь. Хинты полезный, нужный, удобный инструмент, если применять с головой.
после лет 20 программирования - ты присоединишься к темной стороне )))
После того, как какой-нибудь падаван сделает with index, а затем магистр Йода у индекса таблицы disable сделает.
И выдаст сервер сообщение 315 , и не сделает ничего, руками в стороны разведя и вздохнув всеми CPU.
И присоединится наш коллега к ситхам, и пошлет Дарта Вейдера с отборным легионом вырезать все хинты из кода...
...
Рейтинг: 0 / 0
Сравнение loop join с hasj join
    #39576812
dao
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Prologdaoвам прям так надо вывести овер 50 к строк ? чет очень сомневаюсь
скорей всего есть ещё какие-то условия.

но пускай запрос в лоб - обычный left join и без всяких option, ибо то что написано в option применительно для для данного запроса - чушь .

Теперь я понял: это вы не поняли о чём мой вопрос и всё время пытаетесь ответить на какой-то другой.

Тему закрываем. Считаю, что просто loop и hash
я не пытаюсь ответить на другой вопрос - я пытаюсь понять зачем вы используете хинты .
...
Рейтинг: 0 / 0
Сравнение loop join с hasj join
    #39576898
Prolog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andy_OLAPПосле того, как какой-нибудь падаван сделает with index, а затем магистр Йода у индекса таблицы disable сделает.
И выдаст сервер сообщение 315 , и не сделает ничего, руками в стороны разведя и вздохнув всеми CPU.
И присоединится наш коллега к ситхам, и пошлет Дарта Вейдера с отборным легионом вырезать все хинты из кода...
Простите меня за мою дремучесть, но я не знаю, кто такие Дарт Вейдер, Йод, ситхи и падаван. Однако ваша фраза "вырезать все хинты из кода" меня очень насмешила. То есть, если в один прекрасный день Йод закроет доступ к одному из MS SQL серверов, и вы получите набор ошибок типа: "Server not found", "Login failed" или "General Network Error", то тогда Дарт Вейдер пойдёт переписывать данные из баз данных в гросбухи, после чего откажется от использования серверов?

На улицу выходить не стоит - вдруг какой-нибудь Йод уронить вам кирпич на голову. Дома также находится не стоит: может взорваться газ или ударить ток. Короче, опять приходим к "Жизнь - абсолютное зло".

За последние лет 15 я читал, что: "кластерные индексы абсолютное зло", "триггеры абсолютное зло", "суррогатные ключи абсолютное зло", "внешние ключи абсолютное зло", "функции абсолютное зло", "представления абсолютное зло", короче, всего и не перечислишь. И ничего, как-то живу со всем этим.

Я не могу себе представить, как из-за disable trigger, можно отказаться от использования хинтов. Мне кажется проще Йоду надавать по рукам.
...
Рейтинг: 0 / 0
Сравнение loop join с hasj join
    #39576902
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Prolog
Я не могу себе представить, как из-за disable trigger, можно отказаться от использования хинтов. Мне кажется проще Йоду надавать по рукам.
Энди_Олап таким витиеватым языком имел в виду то, что по его мнению хинты плохо, потому, что накладывают на команду разработчиков некие административные расходы.

Например, если один человек напишет LOOP JOIN, а другой, внезапно, отключит индекс на большой таблице по полю соединения, то означенный LOOP сразу резко просядет в производительности против HASHa. Или если какой-то менее опытный боец, не глядя на LOOP напишет хинт INDEX= , то все полетит точно также.

В принципе, все хинтоненавистники строят свои доводы на том, что "вот придет рукожоп" или "вот случится странное" и тогда все будет плохо.

Вариант, что коды проходят ревью, что статистика постоянно обновляется, индексы постоянно ребилдятся, что, в конце-концов, на работу наняты не рукожопы, а люди, способные заметить наличие хинтов в запрос - почему то никогда не рассматривается.
...
Рейтинг: 0 / 0
Сравнение loop join с hasj join
    #39576969
Гигабайт Мегабайтович Килобайтов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CammomileProlog
Я не могу себе представить, как из-за disable trigger, можно отказаться от использования хинтов. Мне кажется проще Йоду надавать по рукам.
Энди_Олап таким витиеватым языком имел в виду то, что по его мнению хинты плохо, потому, что накладывают на команду разработчиков некие административные расходы.

Например, если один человек напишет LOOP JOIN, а другой, внезапно, отключит индекс на большой таблице по полю соединения, то означенный LOOP сразу резко просядет в производительности против HASHa. Или если какой-то менее опытный боец, не глядя на LOOP напишет хинт INDEX= , то все полетит точно также.

В принципе, все хинтоненавистники строят свои доводы на том, что "вот придет рукожоп" или "вот случится странное" и тогда все будет плохо.

Вариант, что коды проходят ревью, что статистика постоянно обновляется, индексы постоянно ребилдятся, что, в конце-концов, на работу наняты не рукожопы, а люди, способные заметить наличие хинтов в запрос - почему то никогда не рассматривается.
понимаешь люди приходят, уходят а системы остаются. И если в одно время команда разработчиков была грамотная, то это не означает, что через три года она же останется в том составе. И таки всегда найдётся юный падаван, который таки умудриться протолкнуть свою "нетленку" . Согласен, правильный процесс разработки таки сокращает риски , но не исключает, а вот уже стоимость таки случившегося риска намного более значима, чем усилия по его предотвращению. И, ихма, таки если возникла необходимость хинтов то проблема назрела, и её надо решать не хинтом, а пересмотром архитектуры, алгоритмов и всего остального. Хинт - это гвоздь на некоторое время, за которое надо понять проблему и решить без хинтов.
...
Рейтинг: 0 / 0
Сравнение loop join с hasj join
    #39577004
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гигабайт Мегабайтович КилобайтовХинт - это гвоздь на некоторое время, за которое надо понять проблему и решить без хинтов.
Однако, это "некоторое время" может быть всего лишь тем временем, пока БД растет до эксплуатационных размеров, а потом план запроса сам превращается в тот, который форсирует данный хинт.
...
Рейтинг: 0 / 0
Сравнение loop join с hasj join
    #39577024
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Работал я как-то пару лет в команде, где хинтовали почты каждый запрос. Под строгим контролем архитектора, само собой.

Более 10 лет так живут, полет отличный. Один из топовых, в своем бизнесе, холдингов. И вот что они делают не так?
...
Рейтинг: 0 / 0
Сравнение loop join с hasj join
    #39577031
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CammomileРаботал я как-то пару лет в команде, где хинтовали почты каждый запрос. Под строгим контролем архитектора, само собой.

Так и у меня такое, не редко происходит. Причина в том, что когда система только запускается, количество записей в справочниках может на порядки превышать количество записей в операциях. Тогда как уже через год-другой эксплуатации все будет с точностью наоборот. Естественно, оптимизировать индексы под корявые планы запроса, которые возникают при текущих статистиках, нет никакого желания. Вот и лепим хинты, чтобы PM не пришлось объяснять клиенту, что если на 1000 операциях отчет выполняется 4 секунды, то это не значит, что на 1 млн. операциях он будет выполняться час.
...
Рейтинг: 0 / 0
Сравнение loop join с hasj join
    #39577032
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, в моем случае, коллеги сильно заморочены на миллисекундах были. Вот и кроили копеечки везде, где могли.
...
Рейтинг: 0 / 0
Сравнение loop join с hasj join
    #39577049
dao
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CammomileРаботал я как-то пару лет в команде, где хинтовали почты каждый запрос. Под строгим контролем архитектора, само собой.

Более 10 лет так живут, полет отличный. Один из топовых, в своем бизнесе, холдингов. И вот что они делают не так?
если там архитектору платят как топ-менеджменту , то наверное делают правильно ))
разговор как раз о таких компаниях, в которых за 3-4 года меняется состав полностью.
...
Рейтинг: 0 / 0
Сравнение loop join с hasj join
    #39577051
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CammomileНу, в моем случае, коллеги сильно заморочены на миллисекундах были. Вот и кроили копеечки везде, где могли.
А вот от этого меня давно отучили. IMHO, если оптимизатор тупит, то лучше явно разбить один запрос на несколько с временными таблицами, чем рисковать, прописывая хинты. При правильном подходе, результат будет идентичный, но зато надежней.
Один из ярких примеров - квитанция для физических лиц по ЖКУ, которая в процессе оптимизации превратилась из двух запросов (заголовок и детали) в восемь. Отдельно пришлось собирать услуги, потребление по точкам учета, показания индивидуальных приборов учета, перерасчеты, потребление ОДН, показания коллективных приборов учета, и распределение ОДН.
...
Рейтинг: 0 / 0
Сравнение loop join с hasj join
    #39577260
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Prologaleks222,
Из области: "Жизнь - абсолютное зло: в её результате наступает смерть".
Зачем-то хинты придумали, и с их помощью запросы работают быстрее. И это факт. Без хинтов и медленно - это абсолютное добро, с хинтами и быстро - это абсолютное зло. Может быть вы просто не умеете ими пользоваться?

Вопрос не про хинты. Вопрос про соединения: "Почему при меньшем количестве Reads и CPU соединение с hash выполняется медленнее, чем loop"? Хинты для того, чтобы получить статистику при разных типах соединений.

1. Глупенький, отменить смерть - ты не в силах. А не использовать хинты - вполне.

2.
Prolog[/src]
результат statistics io:
Код: sql
1.
2.
Table 'Workfile'.    Scan count 0, logical reads 0,   physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'.   Scan count 0, logical reads 0,   physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 



Думаешь 'Workfile/Worktable создаются святым духом?
...
Рейтинг: 0 / 0
Сравнение loop join с hasj join
    #39577302
stgh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Prolog,

тестировалось на 2005 и на 2017

везде loop медленнее.

Код: sql
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.
set nocount on;
use [tempdb]
go

if exists (select 1 from sys.tables where object_id=OBJECT_ID(N'dbo.instruments')) drop table dbo.instruments;
create table dbo.instruments ( instruments_id int identity(1,1) not null, name sysname not null default (CAST(NEWID() as sysname)) ,assettype_id int not null default (ABS(CHECKSUM(NEWID()) % 11) + 1) );
go
if exists (select 1 from sys.tables where object_id=OBJECT_ID(N'dbo.assettypes')) drop table dbo.assettypes;
create table dbo.assettypes ( assettype_id int identity(1,1) not null, name sysname not null default (CAST(NEWID() as sysname)), primary key clustered (assettype_id) )
go

insert into dbo.assettypes default values;
go 11

insert into dbo.instruments default values;
go 50759



set statistics io on;
set statistics time on;

select i.name,t.name from instruments i left loop join assettypes t on t.assettype_id = i.assettype_id option (force order,maxdop 1);

print '---'

select i.name,t.name from instruments i left hash join assettypes t on t.assettype_id = i.assettype_id option (force order,maxdop 1)

set statistics time off;
set statistics io off;
...
Рейтинг: 0 / 0
Сравнение loop join с hasj join
    #39577309
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Естественно. Ты же сделал всё, чтобы этот луп был медленнее. Яб удивился, если бы он в твоих запросах был бы быстрее.
...
Рейтинг: 0 / 0
Сравнение loop join с hasj join
    #39577319
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги, давайте раз и на всегда внесем ясность. Хинт к запросу, это не какая-то там магия-шмагия, которая как-то что-то улучшает.
"Чет медленно, хинтану луп. Ой не вышло, хинтану хеш" - ТАК НЕ РАБОТАЕТ.

Попытаюсь пояснить по-рабоче-крестьянске.

Слева у вас маленькая таблица, справа здоровенная. В большой таблице поле по связи индексировано . Используете луп. При этом, большая и маленькая, понятия, конечно условные. Но вообще, большая, это значит на порядки больше. Слева таблица больше чем справа? Луп плохой. Нет индекса на большой таблице? Луп плохой.

Далее, у вас два упорядоченных по связываемым полям набора данных (читай есть индексы) и размеры сопоставимы ? Используете мердж.

Во всех остальных случаях используете хеш. Всё.
...
Рейтинг: 0 / 0
38 сообщений из 38, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Сравнение loop join с hasj join
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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