IN vs. BETWEEN

leave a comment »

Wenn eine TSQL-Aufgabe in der WHERE Klausel einer Abfrage mit den IN oder BETWEEN Operator implementiert werden kann, soll man sich für die Variante mit dem BETWEEN Operator entscheiden.

Entweder ist diese Option besser oder beide Varianten performieren gleich gut. Der Unterschied ist nicht so groß, aber der Vorteil liegt auf der Seite des BETWEEN-Operators.

Code-Beispiel

Als Beispiel nehmen wir die AdventureWorks Datenbank und die Tabelle SalesOrderHeader aus dem Schema Sales. Wir sollen Order-Details für die Order 43663 und 43664 zurückliefern. Hier sind zwei Abfragen, die jeweils eine Liste mit diesen zwei Orders generieren:

SELECT * FROM Sales.SalesOrderHeader WHERE SalesOrderID IN (43663,43664)
GO
SELECT * FROM Sales.SalesOrderHeader WHERE SalesOrderID >= 43663 AND SalesOrderID <= 43664

Die Ausführungspläne sind identisch:

In den Statistikinformationen sieht man aber, dass in der ersten Abfrage sechs, in der zweiten hingegen nur drei logical reads gemacht wurden:

Analyse

In der Statistik für die erste Abfrage können wir sehen, dass die Clustered Index Seek-Operation zweimal (Scan count 2) durchgeführt wurde. Warum zweimal? Weil der Optimizer eine IN Abfrage in eine entsprechende OR Anfrage konvertiert hat. Eine Index Seek-Operation wird für jedes OR-Teil durchgeführt. Schauen wir das genauer an:

SELECT * FROM Sales.SalesOrderHeader WHERE SalesOrderID IN (43663,43664)
GO
SELECT * FROM Sales.SalesOrderHeader WHERE SalesOrderID=43663 OR SalesOrderID=43664

Mit Hilfe der Ausführungsinformationen können wir herausfinden, dass beide Abfragen mit dem absolut identischen Ausführungsplan und derselben Anzahl an gelesenen Seiten beendet worden sind.

Fazit

Der BETWEEN oder Range-Operator ist ein bisschen besser als IN. Sehr oft spielt dieser Unterschied keine Rolle, aber es ist nicht schlecht zu wissen, wie der Optimizer mit dem IN Operator umgeht. Außerdem gibt es Situationen, wo jeder Leservorgang wichtig ist und dort kann dieser Unterschied sinnvoll sein

Written by Milos R.

5. Mai 2011 um 21:43

Veröffentlicht in Performance

Tagged with ,

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: