Ich war immer davon ausgegangen, dass es nicht den Weg gibt, den man gehen muss, anstatt einen nicht-in-Zustand zu benutzen. Bei einem Vergleich mit einer Abfrage, die ich verwendet habe, habe ich jedoch festgestellt, dass die Ausführung für den Not-in-Zustand tatsächlich schneller zu sein scheint. Jeder Einblick, warum dies der Fall sein könnte, oder ob ich bis jetzt eine schreckliche Annahme gemacht habe, wäre sehr zu begrüßen!
ABFRAGE 1:
%Vor%ABFRAGE 2:
%Vor%Aktueller Ausführungsplan für Abfrage 1:
Aktueller Ausführungsplan für Abfrage 2:
ZEIT / IO-STATISTIK:
Abfrage # 1 (Verwendung nicht vorhanden):
%Vor%Abfrage # 2 (mit Nicht in):
%Vor%soweit ich es verstehe, ein nicht in der gleichen Weise wie zwei verschachtelte Anweisungen würde.
Also, wenn Sie zwei Tabellen haben: Tabelle (1000 Datensätze) und Tabla (2000 Datensätze),
%Vor%ist wie
%Vor%das ist 1000 * 2000 = 2 Millionen Operationen.
der linke Join mit Tabla.field ist Null-Trick, wieder, soweit ich es verstehe, macht nur 2000 Operationen
Verwenden Sie den linken Join.
Die Frage war: "warum NOT IN
scheint schneller zu sein als NOT EXISTS
".
Meine Antwort ist: es scheint nur schneller zu sein, aber es ist dasselbe. (in diesem Fall)
Haben Sie tatsächlich die Zeit für beide Abfragen gemessen und bestätigt, dass ein Unterschied besteht?
ODER Sie haben sich nur die Ausführungspläne angesehen?
Soweit ich weiß, sind die Abfragekosten, die Sie auf den Screenshots sehen (53% gegenüber 47%):
Es scheint, dass in diesem speziellen Fall der Abfrageoptimierer fast identische Pläne für beide Abfragen erzeugt hat. Es ist sehr wahrscheinlich, dass sich die Pläne in der geschätzten Anzahl von Reihen für einige Bediener in den Plänen (geringfügig) unterscheiden, aber die tatsächliche Leistung ist die gleiche, da die Grundrissform die gleiche ist. Wenn sich die geschätzte Anzahl der Zeilen unterscheidet, würde dies zu anderen geschätzten Abfragekosten führen, die Sie sehen.
Um den Unterschied in den Plänen (falls vorhanden) zu sehen, würde ich ein Tool wie verwenden SQL-Sentry-Plan-Explorer Es zeigt mehr Details und Sie können alle Aspekte der Abfragen einfacher vergleichen.
Das Umschreiben der Abfrage, um schneller zu sein, ist eine andere Frage und ich versuche nicht, sie hier zu beantworten.
Tags und Links sql sql-server tsql sql-execution-plan exists