LEFT INNER JOIN und LEFT OUTER JOIN - Warum dauert der OUTER länger?
Wir haben die Abfrage unten. Mit einem LEFT OUTER join dauert 9 Sekunden ausgeführt werden. Die änderung der LINKS AUßEN, LINKS INNEN reduziert sich die Ausführungszeit um 2 Sekunden, und die gleichen Anzahl von Zeilen zurückgegeben werden. Da die gleiche Anzahl von Zeilen, die aus der dbo.Akzeptiert Tabelle verarbeitet werden, unabhängig von den join-Typ, warum sollte der äußere nehmen Sie 3x mehr?
SELECT CONVERT(varchar, a.ReadTime, 101) as ReadDate,
a.SubID,
a.PlantID,
a.Unit as UnitID,
a.SubAssembly,
m.Lot
FROM dbo.Accepts a WITH (NOLOCK)
LEFT OUTER Join dbo.Marker m WITH (NOLOCK) ON m.SubID = a.SubID
WHERE a.LastModifiedTime BETWEEN @LastModifiedTimeStart AND @LastModifiedTimeEnd
AND a.SubAssembly = '400'
InformationsquelleAutor der Frage Randy Minder | 2010-03-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Tatsache, dass die gleiche Anzahl von Zeilen zurückgegeben wird, ist ein nach der Tatsache, dass der Abfrageoptimierer kann nicht im Voraus wissen, dass jede Zeile in Akzeptiert eine entsprechende Zeile mit einem Marker, kann es?
Wenn Sie Verknüpfung zwei Tabellen A und B, sagen wir A hat 1 million Zeilen und B hat 1. Zeile. Wenn Sie sagen, EINE LINKS INNER JOIN B es bedeutet, dass nur Zeilen, die übereinstimmen beide A und B können die Folge sein, so dass die Abfrage-plan ist kostenlos zu scan B zuerst, dann verwenden Sie einen index, um zu tun, einen Bereich Scannen, und vielleicht gibt 10 Zeilen. Aber wenn Sie sagen, dass EIN LEFT OUTER JOIN B dann mindestens alle Zeilen in Ein zurückgegeben werden müssen, so muss der plan Scannen, alles in Einem, egal was er findet in B. Durch die Verwendung eines OUTER-Joins Sie die Beseitigung einer möglichen Optimierung.
Wenn Sie wissendass jede Zeile in der Akzeptiert wird, ein Spiel-Marker, warum dann nicht erklären, die einen Fremdschlüssel zu erzwingen? Der Optimierer sehen die Einschränkung, und wenn Sie vertrauenswürdig ist, wird das berücksichtigen in der Planung.
InformationsquelleAutor der Antwort Remus Rusanu
1) in einem Abfragefenster in SQL Server Management Studio, führen Sie den Befehl:
SET SHOWPLAN_ALL ON
2) führen Sie Ihre langsame Abfragen
3) wird die Abfrage nicht ausgeführt, aber die Ausführung planen, werden zurückgegeben. speichern Sie diese Ausgabe
4) führen Sie Ihre schnelle version der Abfrage
5), wird die Abfrage nicht ausgeführt, aber die Ausführung planen, werden zurückgegeben. speichern Sie diese Ausgabe
6) vergleichen Sie die slow-query-version-Ausgang, um die schnelle Abfrage der version der Ausgabe.
7) wenn Sie noch nicht wissen, warum man langsamer wird, werden beide Ausgänge auf Ihre Frage (Bearbeiten) und hier jemand helfen kann von dort aus.
InformationsquelleAutor der Antwort KM.
Dies ist, weil der LEFT OUTER Join ist mehr Arbeit als ein INNER Join VOR dem senden die Ergebnisse zurück.
Den Inner-Join-sucht alle Datensätze, in denen die AUF Anweisung "true" (Also, wenn es eine neue Tabelle erstellt werden, es stellt nur in Datensätzen, die die m.SubID = ein.SubID). Dann vergleicht er diese Resultate, um Ihre WHERE-Anweisung (Ihre der Zeitpunkt der letzten änderung).
Left Outer Join...Nimmt alle Datensätze in der ersten Tabelle. Wenn die ON-Anweisung ist nicht wahr (m.SubID nicht gleich.SubID), es ist einfach NULLEN der Werte in der zweiten Tabelle die Spalte für das recordset.
Der Grund, bekommen Sie die gleiche Anzahl von Ergebnissen, die am Ende ist wahrscheinlich Zufall, aufgrund der WHERE-Klausel, die passiert, NACHDEM alle, die Vervielfältigung von Aufzeichnungen.
Join (SQL) - Wikipedia
InformationsquelleAutor der Antwort NebuSoft
Warten -- hast du tatsächlich bedeuten, dass "die gleiche Anzahl von Zeilen ... werden verarbeitet", oder dass "die gleiche Anzahl von Zeilen werden zurückgegeben"? Im Allgemeinen, wird das outer-join würden viele mehr Zeilen, einschließlich derjenigen, für die es keine übereinstimmung, auch wenn es gibt die gleiche Anzahl von Datensätzen.
InformationsquelleAutor der Antwort MJB