SQL Server Hash Hash Joins против вложенных петель
-
27-09-2019 - |
Вопрос
Быстрое примечание
Итак, как я писал проблему ниже, я нашел способ исправить это сам. Я думал, что до сих пор опубликую вопрос, потому что:
- Кто-то может найти это полезным.
- Я не понимаю слишком много, почему это работает.
Во всяком случае, фиксированный код (см. Ответы).
Я изначально писал:
Я потратил веков погугулировать это и может найти много связанных ответов, но не совсем соответствует моим вопросам.
Я запускаю код ниже на базе данных SQL Server (10), и она выполняется очень быстро. План выполнения, который он использует, включает в себя хеш присоединиться.
Затем я бегу снова, но на этот раз воспоминал первые две строки (объявляете и устанавливают строки), а также удалите «+1» рядом с y. [Дате] и растрескивание «+ @Counter». Теперь запрос занимает возраст (в возрасте), чтобы завершить - план выполнения вместо этого используя вложенные петли. Обратите внимание, что я все еще просто добавляю один на дату, но используя переменную вместо константы.
Вопрос: Могу ли я сделать запрос, используя @Counter, используйте хеш присоединиться вместо вложенного петли?
(Немного фона: то, что я пытаюсь сделать, это слабо соответствует x. [В на дату] и y. [В на дату], чтобы они соответствовали, если они в течение определенного количества дней друг друга. Количество Дни для запроса для использования заполнены из поля в другой таблице. Я попробовал использовать Dateiff () сначала с ABS () и меньше, но я уверен, что всегда будет использовать вложенные петли. (Это делает, когда я пытаюсь использовать Это все равно!)
Я пытался сделать все, что упоминается в различных параметрах понюхивать статьи, но они не мешали. В любом случае, я не бегаю это как сохраненную процедуру. Я предполагаю, что есть что связано с индексом в поле [В на дату]. Несомненно
-- DECLARE @COUNTER INT
-- SET @COUNTER = 1
BEGIN
SELECT
x.[line id]
, y.[line id]
FROM
lines1 AS x
JOIN lines2 AS y ON (
x.[in date] = y.[in date] + 1 -- + @COUNTER
AND x.[country] = y.[country]
)
WHERE
x.[country] = 'USA'
END
Решение
Вопрос: Могу ли я сделать запрос, используя @Counter, используйте хеш присоединиться вместо вложенного петли?
Да. Вы можете использовать подсказку присоединиться к этому:
INNER HASH JOIN