Хэш-соединения SQL Server против вложенных циклов - PullRequest
0 голосов
/ 16 июня 2010

Быстрая заметка

Итак, когда я писал проблему ниже, я нашел способ исправить ее самостоятельно. Я думал, что все еще отправлю вопрос, потому что:

  1. Кто-то может найти это полезным.
  2. Я не очень понимаю, почему это работает.

В любом случае фиксированный код (см. Ответы).


Я изначально писал:

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

Я запускаю приведенный ниже код для базы данных 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

1 Ответ

1 голос
/ 16 июня 2010

Вопрос: могу ли я сделать запрос, используя @COUNTER, использовать хеш-соединение вместо вложенного цикла?

ДаВы можете использовать подсказку соединения, чтобы заставить это:

INNER HASH JOIN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...