SQL-performance auf LEFT OUTER JOIN vs NICHT EXISTIERT
Wenn ich will, zu finden, die einen Satz von Einträgen in Tabelle A aber nicht in Tabelle B, ich kann entweder die LINKE ÄUßERE VERKNÜPFUNG oder NICHT VORHANDEN ist. Ich habe gehört, SQL Server orientiert sich an der ANSI-und in einigen Fällen LEFT OUTER JOINs sind viel effizienter als NICHT VORHANDEN. Wird der ANSI-JOIN-besser in diesem Fall? und join-Operatoren effizienter als NICHT VORHANDEN im Allgemeinen auf SQL-Server?
Deine Frage ist zu allgemein, um beantwortet werden, bitte geben Sie ein konkretes Beispiel.
InformationsquelleAutor kefeizhou | 2011-07-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Joe ' s link ist ein guter Ausgangspunkt. Quassnoi deckt diese zu.
Im Allgemeinen,, wenn Sie Ihre Felder richtig indiziert sind, ODER wenn Sie erwarten, heraus zu filtern, die mehr Datensätze (D. H. Sie haben eine Menge von Zeilen
EXIST
in der Unterabfrage)NOT EXISTS
besser.EXISTS
undNOT EXISTS
sowohl Kurzschluss - sobald ein Datensatz den Kriterien entspricht, es ist entweder im Lieferumfang enthalten oder ausgefiltert und der optimizer geht zum nächsten Datensatz.LEFT JOIN
beitreten ALLE DATENSÄTZE unabhängig davon, ob Sie übereinstimmen oder nicht, dann filtern alle nicht-übereinstimmenden Datensätzen. Wenn Ihre Tabellen groß sind und/oder Sie mehrereJOIN
Kriterien, das kann sehr sehr ressourcenintensiv.Ich versuche normalerweise verwenden
NOT EXISTS
undEXISTS
wo es möglich ist. Für SQL ServerIN
undNOT IN
sind semantisch gleichwertig und einfacher zu schreiben. Diese sind bei der nur die Operatoren finden Sie in der SQL Server gewährleistet Kurzschluss.wusste gar nicht, dass. Ich normalerweise verwenden Sie nur diese, wenn sehr viele Felder betroffen sind und es schwieriger ist, zu entziffern, in ein
EXISTS
- KlauselVermeiden
NOT IN
. Zumindest beim schreiben von code oder mit einem ORM, die Anzahl der Elemente in der "In-Liste" beschränkt. Siehe auch: sqlperformance.com/2012/12/t-sql-queries/left-anti-semi-join.ich habe Nur eine Sorge. Wenn ich 10000 übereinstimmenden Datensatz und verwenden Sie es nicht in sub-Abfrage. Nicht ganz das heißt, mein sub Abfrage wird ausgeführt 10000 Zeit (d.h. für jeden Datensatz) und beeinträchtigen die Leistung, auf der anderen left join bringt den Datensatz auf einmal und dann filter 10000 übereinstimmenden Datensatz und geben bessere Leistung
InformationsquelleAutor JNK
Die beste Diskussion, die ich gelesen habe zu diesem Thema für SQL Server ist hier.
Ich werde sehen Ihrem Gail Shaw und heben Sie ein Quassnoi: explainextended.com/2009/09/15/...
Ich denke, jemand anderes fallen Sie auch irgendwann, aber ich kann nicht finden es.
Das problem mit diesen beiden Analysen ist, dass Sie nur einfache Fälle. Es gibt sicherlich einige Fälle von komplexen Abfragen, in denen die
LEFT OUTER JOIN
Leistung übertreffen könnenNOT EXISTS
enorm.hoffentlich, wenn Sie tun, eine sehr komplexe Abfrage, die Sie tun werden ein paar Tests als gut. Er bittet um eine Allgemeine Regel - es gibt immer Ausnahmefälle.
InformationsquelleAutor Joe Stefanelli
Persönlich denke ich, dass dies ein, erhält man eine große, alte, "Es Hängt". Ich habe gesehen, Fälle, in denen jede Methode hat als der andere.
Ihre beste Wette ist, um zu prüfen und sehen, welche besser abschneidet. Wenn es eine situation, wo die Tische werden immer kleiner und die performance ist nicht so entscheidend, dann würde ich einfach gehen-welche ist die klarste, um Sie (das ist in der Regel
NOT EXISTS
für die meisten Menschen), und bewegen auf.not exists
mitleft outer join with null check
, ja, es hat deutlich besser funktioniert. Aber immer Nicht Vorhanden ist, die meisten der Zeit wird es deutlich besser,und die Absicht wird klarer, wenn SieNot Exists
.InformationsquelleAutor Tom H
Diese blog-Eintrag gibt Beispiele für verschiedene Möglichkeiten ( NICHT IN, OUTER APPLY, LEFT OUTER JOIN, AUßER und NICHT EXISTIERT ), um die gleichen Ergebnisse und beweist, dass Nicht Existiert ( Left Anti Semi Join () ist die besten Möglichkeiten in kalt-cache und warmen cache-Szenarien.
InformationsquelleAutor N30
Ich habe mich gefragt, wie können wir über den index auf die Tabelle, wir löschen aus, in diesen Fällen, dass die OP beschreibt.
Sagen wir:
In meiner realen Welt Beispiel meine Tabellen sind viel breiter und enthält 1 Million + Zeilen habe ich vereinfacht das schema für Beispiel Zweck.
Wenn ich wollen, löschen Sie die Zeilen aus EMPLOYEE_LOCATION, die nicht über entsprechende emp_id ' s der MITARBEITER kann ich natürlich mit der Linken, äußeren Technik, oder NICHT, aber ich Frage mich...
Wenn beide Tabellen über Indizes verfügen, die mit führenden Spalte emp_id dann würde es sich lohnen, zu versuchen, Sie zu nutzen?
Vielleicht könnte ich ziehen Sie die emp_id from EMPLOYEE, die emp_id aus EMPLOYEE_LOCATION in eine temp-Tabelle und erhalten die emp_id ' s aus dem temp-Tabellen, die ich löschen möchte.
Konnte ich dann Zyklus rund um diese emp_id ist und tatsächlich mit dem index wie folgt:
Ich weiß es ist Aufwand mit der cursor aber in meinem realen Beispiel, bin ich den Umgang mit großen Tabellen, so glaube ich, explizit mit dem index ist wünschenswert.
InformationsquelleAutor user3257560
Einer Ausnahme, die ich bemerkt habe, das
NOT EXISTS
überlegen zu sein (jedoch geringfügig)LEFT JOIN ... WHERE IS NULL
ist bei der Verwendung von Verbindungsserver.Aus der Prüfung der Ausführungspläne, es scheint, dass
NOT EXISTS
operator ausgeführt in einem nested-loop-Mode. Wobei es ausgeführt wird, auf einer pro-Zeilen-basis (die ich nehme an, macht Sinn).Beispiel Ausführungsplan demonstrieren dieses Verhalten:
InformationsquelleAutor pim