Unter einigen SQL Server-Entwicklern ist es eine weit verbreitete Überzeugung, dass NOT IN
es furchtbar langsam ist , und Abfragen sollten umgeschrieben werden, damit sie dasselbe Ergebnis zurückgeben, aber nicht die "bösen" Schlüsselwörter verwenden. ( Beispiel ).
Ist das wahr?
Gibt es zum Beispiel einen bekannten Fehler in SQL Server (welche Version?), Der dazu führt, dass Abfragen mit NOT IN
einem schlechteren Ausführungsplan ausgeführt werden als eine entsprechende Abfrage, die verwendet wird
- ein
LEFT JOIN
mit einem kombiniertenNULL
Scheck oder (SELECT COUNT(*) ...) = 0
in derWHERE
Klausel?
sql-server
query-performance
except
Heinzi
quelle
quelle
IN
/NOT IN
immer mit verschachtelten Schleifen implementiert wird. Und ich habe keine Ahnung, wasstops SQL Server from creating a ‘plan’
das bedeuten soll.Antworten:
Ich glaube nicht, dass es etwas damit zu tun hat, schrecklich langsam zu sein. es hat damit zu tun, dass es möglicherweise ungenau ist. Zum Beispiel mit den folgenden Daten - Bestellungen, die entweder von einem einzelnen Kunden oder einem B2B-Partner aufgegeben werden könnten:
Angenommen, ich möchte alle Kunden finden, die noch nie eine Bestellung aufgegeben haben. In Anbetracht der Daten gibt es nur einen: Kunde 2. Es gibt drei Möglichkeiten, wie ich eine Abfrage schreiben kann, um diese Informationen zu finden (es gibt andere):
Ergebnisse:
Nun gibt es auch einige Leistungsprobleme, über die ich in diesem Blogeintrag spreche . Abhängig von den Daten und Indizes
NOT EXISTS
wird in der Regel eine OutperformanceNOT IN
erzielt, und ich weiß nicht, ob sich die Leistung jemals verschlechtern könnte. Sie sollten auch beachten, dassEXCEPT
eine bestimmte Sortieroperation eingeführt werden kann, sodass Sie möglicherweise unterschiedliche Daten erhalten (wiederum abhängig von der Quelle). Und dass das beliebteLEFT OUTER JOIN ... WHERE right.column IS NULL
Muster immer das schlechteste ist.Martin Smith hat auch in seiner Antwort auf SO eine Menge guter Hintergrundinformationen .
quelle