Ich habe eine Abfrage, die wie folgt aussieht:Schlechte Leistung für OR-Bedingung mit mehreren Tabellen
SELECT *
FROM A
INNER JOIN B ON A.AId = B.AId
WHERE A.ADate BETWEEN @Start and @End
or B.BDate BETWEEN @Start and @End
Beide Tabellen A und B sind etwa die gleiche Größe und viele Reihen haben. Der Ausführungsplan zeigt eine Indexsuche an, sieht aber so aus, als ob er den gesamten Index scannt.
Wenn ich die or
zu and
ändern, dann ist die Abfrage sehr schnell. Ich denke, dies ist aufgrund der Tatsache, dass das Ergebnis der or
kann nicht bekannt, ohne einen Tabellen-Scan in beiden Tabellen, um die or
zu berechnen. Die and
ist leicht in zwei Operationen aufgeteilt.
Ich habe einige Leute gelesen, die angeben, dass es möglich ist, UNION
anstelle von or
zu verwenden, aber dies würde möglicherweise doppelte Zeilen einführen, falls beide Bedingungen im OR wahr sind.
Welche Lösung gibt es, so dass ich die Größe von Join reduzieren und eine vollständige Verknüpfung beider Tabellen verhindern kann? Ich bin offen für die Umstrukturierung der Abfrage jedoch möglich, um dies zu tun, aber die Logik der Abfrage benötigen (geben Sie mir Elemente, wo entweder das Datum in a entspricht dem Bereich oder das Datum in B entspricht dem Bereich) um gleich zu bleiben.
Danke für die Korrektur über UNION, ich werde es ausprobieren. Ich bin ein bisschen besorgt über die unterschiedliche Art, die es tut, um keine Duplikate sicherzustellen, aber es kann schneller sein als das 'oder' Verhalten, das ich sehe. – Kekoa
Sicher.Wenn es nicht gut abschneidet, sollte Mike Parkhill einen Versuch wagen - das ist vielleicht etwas schneller. –