Frage


Schnell Note

So, wie ich das Problem, schreibe unten fand ich einen Weg, um es selbst zu beheben. Ich dachte, ich würde immer noch die Frage posten, weil:

  1. Jemand könnte es nützlich finden.
  2. Ich habe nicht zu viel verstehen, warum es funktioniert.

Wie auch immer der feste Code (siehe Antworten).


Ich schrieb ursprünglich:

Ich habe habe Alter diese googeln und viele ähnliche Antworten finden können, aber keiner, dass genau meine Frage entsprechen.

Ich betreibe den Code unten gegen eine SQL Server (10) Datenbank und führt es sehr schnell. Der Ausführungsplan verwendet es beinhaltet eine Hash-Join.

Dann habe ich es laufen wieder, aber diesmal uncomment die ersten beiden Zeilen (DECLARE und SET-Linien), und auch die ‚+1‘ neben y löschen. [Datum] und Kommentar- der ‚+ @COUNTER‘. Nun ist die Abfrage dauert Alter (nach Alter) zu komplett - der Ausführungsplan statt mit verschachtelten Schleifen. Hinweis Ich bin immer noch nur das Hinzufügen eines zu dem Zeitpunkt, sondern mit einer Variablen anstelle einem konstant.

Die Frage ist: kann ich die Abfrage mit @COUNTER Gebrauch mache eine Hash-Join statt einer verschachtelten Schleife

(ein wenig Hintergrund: Was ich versuche ist locker zu tun x entsprechen. [Datum] und y. [Datum], so dass sie zusammenpassen, wenn sie innerhalb einer bestimmten Anzahl von Tagen voneinander ist. Die Anzahl der Tage für die Abfrage verwendet wird, aus einem Feld in einer anderen Tabelle bevölkert. Ich habe versucht, datediff () zuerst mit abs () verwenden und weniger als, aber ich bin mir ziemlich sicher, das wird immer verschachtelte Schleifen verwenden. (Es tut, wenn ich versuche es trotzdem!)

Ich habe versucht, alles zu tun, in verschiedenen Parameter Sniffing Artikel genannt, aber sie haben nicht die Dinge ändern. Auf jeden Fall bin ich das nicht als gespeicherte Prozedur ausgeführt wird. Ich vermute, es ist etwas mit einem Index auf dem [Datum] Feld zu tun. )

-- 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
War es hilfreich?

Lösung

Die Frage ist: kann ich die Abfrage mit @COUNTER Gebrauch mache eine Hash-Join statt einer verschachtelten Schleife

Ja. Sie können einen Hinweis, dies zu erzwingen beitreten verwenden:

INNER HASH JOIN
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top