Преимущества указания HASH JOIN по сравнению с простым JOIN?

StackOverflow https://stackoverflow.com/questions/800124

Вопрос

Каковы преимущества (если таковые имеются) у явного выполнения HASH JOIN по сравнению с обычным JOIN (при этом SQL Server сам выбирает лучшую стратегию JOIN)?Например:

select pd.*
from profiledata pd
inner hash join profiledatavalue val on val.profiledataid=pd.id

В приведенном выше упрощенном примере кода я указываю стратегию JOIN, тогда как, если я оставлю ключевое слово «хэш», SQL Server незаметно выполнит MERGE JOIN (в соответствии с «фактическим планом выполнения»).

Это было полезно?

Решение

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

Я бы оставил его в покое, если только у вас нет очень сложного запроса или огромных объемов данных, из-за которых он просто не может создать хороший план.Тогда я бы обдумал это.

Но со временем, по мере изменения/роста данных, изменения индексов и т. д., ваша подсказка JOIN устареет и помешает оптимальному плану.Подсказка JOIN может оптимизировать только один запрос на момент разработки с тем набором данных, который у вас есть.

Лично я никогда не указывал подсказку JOIN ни в одном рабочем коде.

Обычно я решал проблему плохого соединения, изменяя свой запрос, добавляя/изменяя индекс или разбивая его (например, сначала загружая временную таблицу).Или мой запрос был неправильным, или у меня было неявное преобразование типа данных, или оно выявило ошибку в моей схеме и т. д.

Я видел, как другие разработчики использовали их, но только там, где у них были сложные представления, вложенные в сложные представления, и они вызывали последующие проблемы при рефакторинге.

Редактировать:

Сегодня у меня было преобразование, в ходе которого некоторые коллеги собираются использовать их, чтобы заставить плохой план запроса (с NOLOCK и MAXDOP 1) «поощрять» миграцию от устаревших сложных вложенных представлений, которые напрямую вызывает одна из их нижестоящих систем.

Другие советы

Когда стоит попробовать хеш-подсказку, как насчет:

  • После проверки, что адекватные индексы существуют по крайней мере на одной из таблиц.
  • После попытки перестроить запрос.Такие вещи, как преобразование соединений в «в» или «существует», изменение порядка соединения (что в любом случае является намеком), перемещение логики, где предложение для соединения и т. Д.

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

Зачем использовать какие-либо подсказки по объединению (хэш/слияние/цикл с побочным эффектом принудительного порядка)?

  • Чтобы избежать чрезвычайно медленного выполнения (0,5 -> 10,0 с) угловых случаев.
  • Когда оптимизатор последовательно выбирает посредственный план.

Предоставленная подсказка, вероятно, будет неидеальной для некоторых обстоятельств, но обеспечивает более предсказуемое время выполнения.Ожидаемый худший и лучший сценарии должны быть предварительно проверены при использовании подсказки.Предсказуемое время выполнения имеет решающее значение для веб-сервисов, где жестко оптимизированный номинальный запрос [.3s, .6s] предпочтительнее, чем запрос, который может варьироваться, например, в диапазоне [.25, 10.0s].Большие отклонения во времени выполнения могут возникнуть при обновлении статистики и соблюдении лучших практик.

При тестировании в среде разработки следует также отключить «обман», чтобы избежать различий во времени горячего и холодного выполнения.От другого почта...

CHECKPOINT -- flushes dirty pages to disk
DBCC DROPCLEANBUFFERS -- clears data cache
DBCC FREEPROCCACHE -- clears execution plan cache

Последняя опция может совпадать с подсказкой option(recompile).

MAXDOP и загрузка машины также могут существенно повлиять на время выполнения.Материализация CTE во временные таблицы также является хорошим механизмом блокировки, и его следует учитывать.

Хэш-соединения распараллеливаются и масштабируются лучше, чем любые другие соединения, и отлично подходят для максимизации пропускной способности в хранилищах данных.

Единственная подсказка, которую я когда-либо видел в коде доставки, была ОПЦИЯ (СИЛОВОЙ ЗАКАЗ).Глупая ошибка в оптимизаторе SQL-запросов привела к созданию плана, который пытался объединить нефильтрованный varchar и уникальный идентификатор.Добавление FORCE ORDER привело к первому запуску фильтра.

Я знаю, что перегружать столбцы — это плохо.Иногда с этим приходится жить.

Оптимизатор логического плана не гарантирует, что он найдет оптимальное решение:точный алгоритм слишком медленный для использования на рабочем сервере;вместо этого используются некоторые жадные алгоритмы.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top