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

Откуда:
Сообщений: 24
Всем Привет!
Собственно вопрос.....

select * from table1 t1
inner join table2 t2 on t1.id = t2.id

select * from table1 t1
inner HASH join table2 t2 on t1.id = t2.id

Объясните пожалуйста простым языком в чём отличие..
и когда имеет смысл использовать HASH join.

Спасибо!
5 июл 13, 09:23    [14525522]     Ответить | Цитировать Сообщить модератору
 Re: Отличие inner join - inner HASH join  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
ackidZS
Всем Привет!
Собственно вопрос.....

select * from table1 t1
inner join table2 t2 on t1.id = t2.id

select * from table1 t1
inner HASH join table2 t2 on t1.id = t2.id

Объясните пожалуйста простым языком в чём отличие..
и когда имеет смысл использовать HASH join.

Спасибо!

Microsoft, да и матёрые SQL девелоперы не рекомендуют пользоваться хинтам соединения.

Предоставьте право выбора типа физического оператора соединения оптимизатору
5 июл 13, 09:26    [14525537]     Ответить | Цитировать Сообщить модератору
 Re: Отличие inner join - inner HASH join  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21102
ackidZS
Объясните пожалуйста простым языком в чём отличие..

В случае inner join оптимизатору позволено выбрать метод. В случае inner hash join ему позволено работать только указанным методом, даже если это заведомо невыгодно - или послать кодера с его кретинскими хинтами.

ackidZS
и когда имеет смысл использовать HASH join.

Если одновременно:
- входные наборы реально большие
- входные наборы по размеру значительно различаются (и не в разы, а на порядки)
- связывание входных наборов выполняется по предикатам, на которые нет сортирующего индекса, пригодного к эффективному использованию в этом связывании
5 июл 13, 09:47    [14525636]     Ответить | Цитировать Сообщить модератору
 Re: Отличие inner join - inner HASH join  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Akina
ackidZS
и когда имеет смысл использовать HASH join.

Если одновременно:
- входные наборы реально большие
- входные наборы по размеру значительно различаются (и не в разы, а на порядки)
- связывание входных наборов выполняется по предикатам, на которые нет сортирующего индекса, пригодного к эффективному использованию в этом связывании

Это верно, но для одного запроса это будет хорошо, а для другого совсем плохо. Поэтому и не рекомендуются хинты при разработке
5 июл 13, 09:50    [14525649]     Ответить | Цитировать Сообщить модератору
 Re: Отличие inner join - inner HASH join  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Во, нашёл наконец) В закладках:

Сравнение LOOP,HASH,MERGE
5 июл 13, 09:55    [14525688]     Ответить | Цитировать Сообщить модератору
 Re: Отличие inner join - inner HASH join  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
Ко всему вышесказанному, чтобы использовать hash или merge join надо использовать предикат эквивалентности в соединении множеств.
5 июл 13, 10:01    [14525714]     Ответить | Цитировать Сообщить модератору
 Re: Отличие inner join - inner HASH join  [new]
ackidZS
Member

Откуда:
Сообщений: 24
Всем спасибо!
Стало понятнее..
5 июл 13, 10:40    [14526003]     Ответить | Цитировать Сообщить модератору
 Re: Отличие inner join - inner HASH join  [new]
Denis Reznik
Member

Откуда: Киев
Сообщений: 156
ackidZS
Всем Привет!
Собственно вопрос.....

select * from table1 t1
inner join table2 t2 on t1.id = t2.id

select * from table1 t1
inner HASH join table2 t2 on t1.id = t2.id

Объясните пожалуйста простым языком в чём отличие..
и когда имеет смысл использовать HASH join.

Спасибо!


HASH здесь, это хинт - указание оптимизатору какой физический тип джоина ему следует выбрать. Из практики, когда это может быть полезно - оптимизация запросов, когда оптимизатор упрямо выбирает другой тип джоина, например NESTED LOOPS, основываясь на статистике или предположениях, что в наборе небольшое количество строк (например, когда в запросе используется табличная переменная). Но ставя хинт нужно чётко понимать для чего это нужно, и что это самый лучший вариант оптимизации.
5 июл 13, 13:35    [14527395]     Ответить | Цитировать Сообщить модератору
 Re: Отличие inner join - inner HASH join  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21102
Denis Reznik
HASH здесь, это хинт - указание оптимизатору какой физический тип джоина ему следует выбрать. Из практики, когда это может быть полезно - оптимизация запросов, когда оптимизатор упрямо выбирает другой тип джоина, например NESTED LOOPS, основываясь на статистике или предположениях, что в наборе небольшое количество строк (например, когда в запросе используется табличная переменная). Но ставя хинт нужно чётко понимать для чего это нужно, и что это самый лучший вариант оптимизации.

И ещё одна ремарка. Со временем следует пересматривать свои хинты. Меняется наполнение, статистика, железо, структура... в общем, хинт может устареть, и, проработав долгое время ускорителем, вдруг стать весьма таким конкретным тормозом.
5 июл 13, 13:53    [14527534]     Ответить | Цитировать Сообщить модератору
 Re: Отличие inner join - inner HASH join  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Ещё важно упомянуть, что использование такого хинта эквивалентно неявному указанию OPTION(FORCE ORDER). Даже если в соединениях участвует много таблиц, а хинт HASH JOJN указан только для одной таблицы, то все таблицы будут соединяться в порядке перечисления в запросе. Это же относится и к хинтам LOOP JOIN и MERGE JOIN.
5 июл 13, 14:08    [14527644]     Ответить | Цитировать Сообщить модератору
 Re: Отличие inner join - inner HASH join  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Вот хороший обзор.
Join Hints
8 июл 13, 09:47    [14534113]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить