АБСОЛЮТНО.Хеш-матч был бы огромным улучшением.Создание хеша для таблицы строк меньшего размера 19 223, а затем поиск в ней с помощью таблицы строк большего размера, равной 65 991, является гораздо меньшей операцией, чем для вложенного цикла, требующего 1 268 544 993 сравнения строк.
Единственная причина, по которой сервер выбирает вложенные циклы, заключается в том, чточто он сильно недооценил количество задействованных строк.Есть ли в ваших таблицах статистика по ним, и если да, регулярно ли они обновляются?Статистика - это то, что позволяет серверу выбирать хорошие планы выполнения.
Если вы правильно обращались к статистике и у вас все еще есть проблема, вы можете заставить ее использовать HASH-соединение следующим образом:
SELECT *
FROM
TableA A -- The smaller table
LEFT HASH JOIN TableB B -- the larger table
Обратите внимание, что в тот момент, когда вы это сделаете, это также вызовет порядок соединения.Это означает, что вы должны правильно расположить все свои таблицы так, чтобы их порядок объединения имел смысл.Как правило, вы проверяете план выполнения, который уже есть на сервере, и изменяете порядок ваших таблиц в запросе для соответствия.Если вы не знакомы с тем, как это сделать, основы в том, что каждый «левый» ввод идет первым, а в графических планах выполнения левый ввод - ниже .Сложное объединение, включающее много таблиц, может потребовать сгруппировать объединения в круглых скобках или использовать RIGHT JOIN
для того, чтобы план выполнения был оптимальным (поменяйте местами левый и правый входы, но представьте таблицу в правильной точке в порядке объединения).
Как правило, лучше избегать использования подсказок о соединении и принудительного порядка соединения, поэтому сначала делайте все, что можете!Вы можете посмотреть на индексы в таблицах, фрагментацию, уменьшить размеры столбцов (например, использовать varchar
вместо nvarchar
, где Unicode не требуется) или разбить запрос на части (сначала вставьте во временную таблицу, а затем соединитек этому).