2010-04-22 10 views
7

Diese beiden Aussagen sind logisch äquivalent:ZWISCHEN Operator vs.> = UND <=: Gibt es einen Leistungsunterschied?

SELECT * FROM table WHERE someColumn BETWEEN 1 AND 100 

SELECT * FROM table WHERE someColumn >= 1 AND someColumn <= 100 

Gibt es einen möglichen Leistungsvorteil zu einem im Vergleich zu den andere?

+1

Mir war nicht einmal bewusst, dass es einen Zwischenoperator gab. Wenn ich es zum ersten Mal sah, war es mir nicht 100% klar, ob zwischen inclusive oder exclusiv wäre. Ich habe richtig geraten, aber da die Antworten sagen, dass es keinen Leistungsunterschied gibt, würde ich bei der zweiten Version bleiben, um es klarer zu machen. Ich bin jedoch die Art von Person, die Klammern hinzufügen wird, wo sie nicht benötigt werden, nur um sicher zu sein, dass es kein Missverständnis gibt, wenn jemand anderes meinen Code liest. – drs9222

Antwort

4

Kein Vorteil, nur eine Syntax Zucker.

Mit der Version BETWEEN können Sie in einigen Fällen eine Funktionsneubewertung vermeiden.

1

Nein, keine Leistung. Es ist nur ein wenig Süßigkeiten.

Wenn Sie eine Abfrage Vergleich zu überprüfen sind, so etwas wie

DECLARE @Table TABLE(
     ID INT 
) 

SELECT * 
FROM @Table 
WHERE ID >= 1 AND ID <= 100 

SELECT * 
FROM @Table 
WHERE ID BETWEEN 1 AND 100 

und prüfen Sie den Ausführungsplan, sollten Sie feststellen, dass es genau die gleichen.

1

Es gibt keinen Leistungsvorteil, es ist einfacher, den ersten zu lesen/schreiben.

1

Hmm, hier war ein überraschendes Ergebnis. Ich habe SQL Server hier nicht, also habe ich das in Postgres versucht. Offensichtlich gelten Haftungsausschlüsse: Dies führt nicht unbedingt zu den gleichen Ergebnissen, Ihre Laufleistung kann variieren, konsultieren Sie einen Arzt vor der Verwendung. Aber trotzdem ...

Ich schrieb eine einfache Abfrage auf zwei verschiedene Arten:

select * 
from foo 
where (select code from bar where bar.barid=foo.barid) between 'A' and 'B' 

und

select * 
from foo 
where (select code from bar where bar.barid=foo.barid)>='A' 
and (select code from bar where bar.barid=foo.barid)<='B' 

Überraschenderweise mich, beide fast identische Laufzeiten hatten. Als ich einen EXPLAIN PLAN machte, gaben sie identische Ergebnisse. Insbesondere führte die erste Abfrage zweimal eine Suche nach einem Balken durch, einmal für den Test> = und erneut für den Test < =, genau wie die zweite Abfrage.

Fazit: In BETTEN ist BETWEEN in der Tat nur syntaktischer Zucker.

Persönlich verwende ich es regelmäßig, weil es für den Leser klarer ist, besonders wenn der getestete Wert ein Ausdruck ist. Herauszufinden, dass zwei komplexe Ausdrücke identisch sind, kann eine nicht-triviale Übung sein. Herauszufinden, dass zwei komplexe Ausdrücke identisch sein sollten, auch wenn sie nicht identisch sind, ist noch schwieriger.

Verwandte Themen