SQL Server IN vs. EXISTS Leistung
Ich bin gespannt, welche der unten folgenden noch effizienter wäre?
Ich war schon immer ein wenig vorsichtig über die Verwendung von IN
weil ich glaube, dass SQL Server wandelt das ResultSet in eine große IF
- Anweisung. Für ein großes ResultSet dies könnte dazu führen, schlechte Leistung. Für kleine Resultsets, ich bin mir nicht sicher, entweder ist vorzuziehen. Bei großen Ergebnismengen, wäre das nicht EXISTS
effizienter sein?
WHERE EXISTS (SELECT * FROM Base WHERE bx.BoxID = Base.BoxID AND [Rank] = 2)
vs.
WHERE bx.BoxID IN (SELECT BoxID FROM Base WHERE [Rank = 2])
InformationsquelleAutor der Frage Randy Minder | 2010-01-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
EXISTS
wird schneller sein, weil sobald der Motor hat ein Treffer, es zu beenden suchen, das die Bedingung hat sich als wahr.Mit
IN
es sammelt alle Ergebnisse der unteranfrage vor der weiteren Verarbeitung.InformationsquelleAutor der Antwort keithwarren7
Habe ich einige Tests auf SQL Server 2005 und 2008, und auf beiden die EXISTIERT, und die kommen zurück mit der exakt gleichen tatsächlichen Ausführungsplan, wie die anderen gesagt haben. Der Optimizer ist optimal. 🙂
Etwas bewusst sein, obwohl, EXISTS, IN, und die VERKNÜPFUNG kann manchmal unterschiedliche Ergebnisse zurückgeben, wenn Sie nicht formuliere deine Abfrage genau das richtige: http://weblogs.sqlteam.com/mladenp/archive/2007/05/18/60210.aspx
InformationsquelleAutor der Antwort Adam Nofsinger
Die akzeptierte Antwort ist kurzsichtig und die Frage ein bisschen lose:
Glaube ich, dass der optimizer ist intelligent genug, um zu konvertieren zwischen "in" vs "existiert", wenn es eine signifikante Kostendifferenz aufgrund von (1) und (2), sonst kann es nur als Hinweis herangezogen werden (z.B. besteht, um die Nutzung eines a seekable index auf der rechten Seite).
Beide Formen umgewandelt werden können, um join-Formen intern haben die join-Reihenfolge Umgekehrt und läuft als loop, hash-oder merge-basierend auf der geschätzten Zeilenanzahl (Links und rechts) und der index-Existenz in den linken, rechten oder beiden Seiten.
InformationsquelleAutor der Antwort crokusek
Würde ich BESTEHT darüber, siehe unten link:
SQL Server: JOIN vs IN vs VORHANDEN - der logische Unterschied
InformationsquelleAutor der Antwort Tanner
Die Ausführungspläne werden in der Regel gehen identisch ist, in diesen Fällen, aber bis Sie sehen, wie der Optimierer Faktoren, die in allen anderen Aspekten des Indizes etc., Sie werden wirklich nie know.
InformationsquelleAutor der Antwort Cade Roux
So, IN ist nicht das gleiche, wie es noch wird es produzieren die gleichen execution-plan.
In der Regel verwendet wird, in einer korrelierten Unterabfrage, das bedeutet, dass Sie JOIN der EXISTIERT inneren Abfrage mit Ihrem äußeren Abfrage. Das wird weitere Schritte hinzufügen, um ein Ergebnis produzieren, wie Sie benötigen, um zu lösen der äußeren Abfrage Verknüpfungen und die innere Abfrage wird dann passend zu Ihren where-Klauseln Mitgliedschaft in beiden.
IN der Regel verwendet wird, ohne die Richtung der inneren Abfrage mit der äußeren Abfrage, und das kann gelöst werden, in nur einem Schritt (im besten Fall).
Bedenken Sie:
Wenn Sie IN und die innere Abfrage-Ergebnis Millionen von Zeilen mit unterschiedlichen Werten, wird es wahrscheinlich LANGSAMER als VORHANDEN, gegeben, dass die EXISTS-Abfrage performant ist (hat das Recht, Indizes, join-mit der äußeren Abfrage).
Wenn Sie VORHANDEN ist, und die Verknüpfung mit Ihrem äußeren Abfrage ist komplexer (braucht mehr Zeit zum ausführen, keine geeigneten Indizes) es verlangsamt die Abfrage, indem Sie die Anzahl der Zeilen der äußeren Tabelle, manchmal ist die geschätzte Zeit bis zum abschließen kann in Tagen. Wenn die Anzahl der Zeilen ist akzeptabel für Ihren jeweiligen hardware, oder die Kardinalität der Daten korrekt ist (beispielsweise weniger UNTERSCHIEDLICHE Werte in einem großen data set) IN ausführen können, schneller, als VORHANDEN ist.
Alle der oben genannten wird vermerkt, wenn Sie eine angemessene Anzahl von Zeilen in jeder Tabelle (von der fair-ich meine etwas, das überschreitet die CPU und/oder ram-Schwellenwerte für caching).
So, die ANTWORT ist es HÄNGT ab. Schreiben Sie eine komplexe Abfrage in IN oder EXISTIERT, aber als Faustregel gilt, sollten Sie versuchen, mit einer begrenzten Menge unterschiedlicher Werte und EXISTIERT, wenn Sie haben eine Menge von Zeilen mit einer Menge von verschiedenen Werten.
Der trick ist, um die Anzahl der Zeilen, die durchsucht werden sollen.
Grüße,
MarianoC
InformationsquelleAutor der Antwort MarianoC
Zur Optimierung der
EXISTS
werden sehr wörtlich; so etwas muss einfach da sein, aber braucht man eigentlich nicht alle Daten zurückgegeben, die von der korrelierte sub-query. Du bist nur der Auswertung einer booleschen Bedingung.Also:
WHERE EXISTS (SELECT TOP 1 1 FROM Base WHERE bx.BoxID = Base.BoxID AND [Rank] = 2)
Weil die korrelierte sub-query ist
RBAR
das erste Ergebnis der Treffer macht die Bedingung wahr, und Sie verarbeitet Sie nicht weiter.InformationsquelleAutor der Antwort Josh Lewis
Aus der Spitze von meinem Kopf und werden nicht garantiert, um korrekt zu sein: ich glaube, die zweite wird schneller sein in diesem Fall.
IN
wird Kurzschluss, sobald es eine übereinstimmung findet.InformationsquelleAutor der Antwort RedFilter