Быстрая заметка
Итак, когда я писал проблему ниже, я нашел способ исправить ее самостоятельно. Я думал, что все еще отправлю вопрос, потому что:
- Кто-то может найти это полезным.
- Я не очень понимаю, почему это работает.
В любом случае фиксированный код (см. Ответы).
Я изначально писал:
Я целую вечность гуглял по этому вопросу и могу найти много похожих ответов, но ни один из них не соответствует моему вопросу.
Я запускаю приведенный ниже код для базы данных SQL Server (10), и он выполняется очень быстро.
План выполнения, который он использует, включает хеш-соединение.
Затем я запускаю его снова, но на этот раз раскомментируем первые две строки (строки DECLARE и SET), а также удаляем «+1» рядом с y. [В дате] и раскомментируем «+ @COUNTER».
Теперь для выполнения запроса требуются возрасты (по возрастам) - вместо этого используется план выполнения с использованием вложенных циклов. Обратите внимание, я все еще просто добавляю один к дате, но использую переменную вместо константы.
Вопрос заключается в следующем: можно ли сделать запрос, используя @COUNTER, использовать хеш-соединение вместо вложенного цикла?
(немного фона:
То, что я пытаюсь сделать, это свободно сопоставлять x. [В дате] и y. [В дате], чтобы они совпадали, если они находятся в пределах определенного количества дней друг от друга. Количество дней для использования запроса заполняется из поля в другой таблице. Сначала я попытался использовать datediff () с abs () и less, но я уверен, что всегда будут использоваться вложенные циклы. (Это так, когда я все равно пробую!)
Я пытался делать все, что упоминалось в различных статьях по анализу параметров, но они ничего не изменили. Во всяком случае, я не запускаю это как хранимую процедуру. Я предполагаю, что есть какое-то отношение к индексу в поле [в дате]. )
-- 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