Pergunta


Nota rápida

Então, enquanto escrevia o problema abaixo, encontrei uma maneira de consertá -lo sozinho. Eu pensei que ainda postaria a pergunta porque:

  1. Alguém pode achar útil.
  2. Não entendo muito por que funciona.

De qualquer forma, o código fixo (consulte as respostas).


Eu escrevi originalmente:

Passei anos pesquisando isso no Google e posso encontrar muitas respostas relacionadas, mas nenhuma que corresponda exatamente à minha pergunta.

Eu executo o código abaixo em um banco de dados SQL Server (10) e ele é executado muito rápido. O plano de execução que ele usa envolve uma junção de hash.

Então eu o executei novamente, mas desta vez descommentam as duas primeiras linhas (declarar e definir linhas) e também excluir o '+1' ao lado de Y. [Na data] e não se dedicar ao '+ @counter'. Agora, a consulta leva as idades (e as idades) para concluir - o plano de execução, em vez de usar loops aninhados. Observe que ainda estou apenas adicionando um à data, mas usando uma variável em vez de uma constante.

A pergunta é: posso fazer a consulta usando @counter usar uma junção de hash em vez de um loop aninhado?

(Um pouco de fundo: o que estou tentando fazer é corresponder livremente x. [Na data] e y. [Na data], para que eles correspondam se estiverem dentro de um número especificado de dias um do outro. O número de Dias para a consulta usar é preenchida em um campo em outra tabela. Tentei usar o datdiff () primeiro com abs () e menos do que, mas tenho certeza de que isso sempre usará loops aninhados. (Isso faz quando tento de qualquer maneira!)

Tentei fazer tudo referido em vários artigos de cheirar parâmetros, mas eles não mudaram as coisas. De qualquer forma, não estou executando isso como um procedimento armazenado. Acho que há algo a ver com um índice no campo [In Date]. )

-- 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
Foi útil?

Solução

A pergunta é: posso fazer a consulta usando @counter usar uma junção de hash em vez de um loop aninhado?

Sim. Você pode usar uma dica de junção para forçar isso:

INNER HASH JOIN
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top