Ich habe eine insert-select-Anweisung, die nur Zeilen einfügen muss, in denen eine bestimmte Kennung der Zeile in keiner der beiden anderen Tabellen existiert. Welche der folgenden wäre schneller?
%Vor%... oder ...
%Vor%... oder machen sie ungefähr dasselbe? Gibt es außerdem eine andere Möglichkeit, diese Abfrage zu strukturieren, die vorzuziehen wäre? Ich mag Unterabfragen generell nicht, da sie der Abfrage eine weitere "Dimension" hinzufügen, die die Laufzeit durch Polynomfaktoren erhöht.
Normalerweise spielt es keine Rolle, ob NOT IN
langsamer / schneller ist als NOT EXISTS
, weil sie bei Vorhandensein von NULL
NICHT äquivalent sind. Lesen Sie:
In diesen Fällen wollen Sie fast immer NOT EXISTS
, weil es das normalerweise erwartete Verhalten hat.
Wenn sie äquivalent sind, ist es wahrscheinlich, dass Ihre Datenbank dies bereits herausgefunden hat und für beide denselben Ausführungsplan generiert.
In den wenigen Fällen, in denen beide Optionen äquivalent sind und Ihre Datenbank dies nicht herausfinden kann, ist es besser, beide Ausführungspläne zu analysieren und die besten Optionen für Ihren speziellen Fall auszuwählen.
Sie könnten einen LEFT OUTER JOIN verwenden und prüfen, ob der Wert in der RIGHT-Tabelle NULL ist. Wenn der Wert NULL ist, ist die Zeile nicht vorhanden. Das ist eine Möglichkeit, Unterabfragen zu vermeiden.
%Vor%Es hängt von der Größe der Tabellen, den verfügbaren Indizes und der Kardinalität dieser Indizes ab.
Wenn Sie nicht den gleichen Ausführungsplan für beide Abfragen erhalten, und wenn keine der beiden Abfragen eine JOIN anstelle einer Unterabfrage ausführt, würde ich annehmen, dass Version zwei schneller ist. Version eins ist korreliert und würde daher viele weitere Unterabfragen erzeugen, Version zwei kann mit insgesamt drei Abfragen zufrieden sein.
(Beachten Sie auch, dass verschiedene Engines in die eine oder andere Richtung verzerrt sein können. Einige Engines können korrekt feststellen, dass die Abfragen dieselben sind (wenn sie tatsächlich sind) und in dasselbe auflösen Ausführungsplan.)
Für größere Tabellen wird empfohlen, NOT EXISTS / EXISTS zu verwenden, da die IN-Klausel die Unterabfrage abhängig von der Architektur der Tabellen oft ausführt.
Basierend auf Kostenoptimierer:
Es gibt keinen Unterschied.
Tags und Links sql performance tsql