2013-06-03 27 views
8

Angenommen, ich eine Tabelle mit Spalte, die Werte von 1 bis 10. Ich Spalten mit allen Werten mit Ausnahme von 9 und 10. Wird es ein Unterschied (Performance-weise) auswählen muß statt, wenn Ich benutze diese Abfrage:SQL - IN vs. NICHT IN

SELECT * FROM tbl WHERE col NOT IN (9, 10) 

und dieses?

SELECT * FROM tbl WHERE col IN (1, 2, 3, 4, 5, 6, 7, 8) 
+2

'ZWISCHEN 1 UND 8' wären wahrscheinlich vorzuziehen, obwohl jede Zeit auch nicht wert, das Problem für eine so kleine Tabelle betrachtet wird. Ist Ihre tatsächliche Situation anders? –

+0

Entschuldigung, du hast Recht. löschen. –

+0

@Martin Smith - Ich dachte, es ist eine theoretische Situation, ich werde diese Abfragen nicht verwenden :) – kyooryu

Antwort

8

Wenn es um die Leistung, die Sie immer Ihren Code Profil sollte (das heißt Ihre Abfragen paar tausend mal laufen und messen jeweils Schleifen Leistung eine Art von stopwatch verwenden. Sample).

Aber hier empfehle ich sehr, die erste Abfrage für bessere zukünftige Wartung zu verwenden. Die Logik ist, dass Sie alle Datensätze außer 9 und 10 benötigen. Wenn Sie Wert 11 zu Ihrer Tabelle hinzufügen und zweite Abfrage verwenden, wird die Logik Ihrer Anwendung unterbrochen, was natürlich zu einem Fehler führt.

Edit: Ich erinnere mich, dass dies als php markiert wurde, deshalb habe ich Probe in PHP zur Verfügung gestellt, aber ich könnte mich irren. Ich denke, es wird nicht schwer sein, das Sample in der von Ihnen verwendeten Sprache neu zu schreiben.

SELECT * FROM tbl WHERE ((col <> 9 and col <> 10)) 

Das Gleiche gilt für die andere, mit 8-mal = statt:

0

Eine Liste der Konstanten, MySQL wird intern Code erweitern.

Also ja, wird die erste schneller, weniger Vergleiche durchgeführt werden. Die Wahrscheinlichkeit, dass es messbar ist, ist vernachlässigbar, obwohl der Aufwand einer Handvoll konstanter Vergleiche nichts im Vergleich zu dem allgemeinen Aufwand beim Parsen von SQL und beim Abrufen von Daten ist.

+1

Das OP hat uns nicht mitgeteilt, auf welchem ​​RDBMS es läuft, aber AFAIK in MySQL ein 'IN' mit Eine Liste von Konstanten wird implementiert, indem eine binäre Suche der Liste anstelle von 8 '=' Vergleichen verwendet wird. –

+0

Selbst wenn ich das rechne (ich rechne nie damit, dass MySQL irgendeine Art von 'fortgeschrittener' Optimierung, sicherster Annahme), macht es den zweiten theoretisch etwas langsamer, weil noch mehr Vergleiche gemacht werden müssen. –

2

Ich habe gesehen, Oracle hat Probleme bei der Optimierung einiger Abfragen mit NOT IN, wenn Spalten Nullable sind. Wenn Sie Ihre Anfrage in beide Richtungen schreiben können, ist IN, soweit es mich betrifft, bevorzugt.

9

Use „IN“, wie es höchstwahrscheinlich das DBMS machen verwenden einen Index für die entsprechende Spalte.

„NOT IN“ in der Theorie könnte auch in eine Index Verwendung übersetzt werden, aber in einer komplizierteren Art und Weise, die DBMS möglicherweise nicht „Overhead-Zeit verbringen“ verwenden.