Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL-Leistung bei LEFT OUTER JOIN vs. NOT EXISTS

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.