Я вижу ответы здесь, которые не будут работать в синтаксисе SQL Server. Я использовал бы:
select t.range as [score range], count(*) as [number of occurences]
from (
select case
when score between 0 and 9 then ' 0-9 '
when score between 10 and 19 then '10-19'
when score between 20 and 29 then '20-29'
...
else '90-99' end as range
from scores) t
group by t.range
РЕДАКТИРОВАНИЕ: см. комментарии
HASH JOIN
полезно, когда большой процент строк вносит вклад в набор результатов.
В вашем случае создание HASH TABLE
на A
или B
, и сканирование другой таблицы дешевле, чем выполнение NESTED LOOPS
по индексу на B .ID
или объединение отсортированных наборов результатов, которые оптимизатор использовал перед подсказкой.
Оптимизатор SQL Server
этого не заметил: возможно, потому что вы не собирали статистику, возможно, потому что распределение ваших данных искажено .
Обновление:
Поскольку вы упомянули, что LOOP JOIN
повысили скорость, возможно, порядок JOIN
был выбран оптимизатором неправильно.