Joes Link ist ein guter Ausgangspunkt. Quassnoi deckt das auch ab.
Allgemein wenn Ihre Felder richtig indiziert sind ODER wenn Sie erwarten, mehr Datensätze herauszufiltern (d. h. viele Zeilen EXIST
haben in der Unterabfrage) NOT EXISTS
wird besser funktionieren.
EXISTS
und NOT EXISTS
beide kurzgeschlossen - sobald ein Datensatz den Kriterien entspricht, wird er entweder aufgenommen oder herausgefiltert und der Optimierer fährt mit dem nächsten Datensatz fort.
LEFT JOIN
wird ALL RECORDS beitreten Unabhängig davon, ob sie übereinstimmen oder nicht, filtern Sie dann alle nicht übereinstimmenden Datensätze heraus. Wenn Ihre Tabellen groß sind und/oder Sie mehrere JOIN
haben Kriterien kann dies sehr, sehr ressourcenintensiv sein.
Normalerweise versuche ich, NOT EXISTS
zu verwenden und EXISTS
wo möglich. Für SQL Server IN
und NOT IN
sind semantisch äquivalent und möglicherweise einfacher zu schreiben. Dies sind unter den einzigen Operatoren, die Sie in SQL Server finden werden und die garantiert kurzschließen.