Domanda


Nota veloce

Così, mentre stavo scrivendo il problema qui sotto ho trovato un modo per risolvere il problema stesso. Ho pensato di postare ancora la questione perché:

  1. Qualcuno potrebbe trovare utile.
  2. Non capisco troppo perché funziona.

In ogni caso il codice fisso (vedi risposte).


Originariamente ho scritto:

ho trascorso le età googling questo e può trovare un sacco di risposte correlate, ma nessuno che corrisponde esattamente alla mia domanda.

I eseguire il codice qui sotto contro un database di SQL Server (10) ed esegue molto veloce. Il piano di esecuzione che utilizza comporta un join hash.

Poi ho eseguito di nuovo, ma questa volta rimuovere il commento le prime due righe (dichiarare e SET linee), e anche cancellare il '1' accanto a. [Data] e rimuovere il commento dalla '+ @COUNTER'. Ora la query prende le età (su età) per completare - il piano di esecuzione invece utilizzando cicli annidati. Nota Sto ancora semplicemente aggiungendo uno alla data, ma utilizzando una variabile al posto di una costante.

La domanda è: Posso fare la query utilizzando uso @COUNTER un join hash invece di un ciclo annidato

(un po 'di fondo: Quello che sto cercando di fare è liberamente abbinare x. [Data] e a. [Data] in modo che corrispondano se sono all'interno di un determinato numero di giorni l'uno dall'altro. Il numero di giorni per la query di uso è popolato da un campo di un'altra tabella. Ho provato ad utilizzare datediff () prima con abs () e meno di, ma sono abbastanza sicuro che sta per usare sempre cicli annidati. (Lo fa quando provo lo stesso!)

Ho provato a fare tutto ciò di cui agli articoli vari parametri sniffing, ma non ha cambiato le cose. In ogni caso io non corro questo come una stored procedure. Sto indovinando c'è qualcosa a che fare con un indice sul campo [data]. )

-- 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
È stato utile?

Soluzione

La domanda è: Posso fare la query utilizzando uso @COUNTER un join hash invece di un ciclo annidato

Sì. È possibile utilizzare un join suggerimento per forzare questo:

INNER HASH JOIN
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top