Inhaltsverzeichnis
Was ist Hash-Join in Oracle?
Hash-Joins werden verwendet, wenn das Joinen großer Tabellen erfolgt oder wenn die Joins die meisten Zeilen der verknüpften Tabellen erfordern. Dies wird nur für Gleichheitsverknüpfungen verwendet
Algorithmus für Oracle Hash Join
1) Der Optimierer verwendet die kleinere der beiden Tabellen, um eine Hash-Tabelle im Speicher zu erstellen. Eine kleine Tabelle wird als Erstellungstabelle bezeichnet
Bauphase
Für jede Zeile in kleiner Tabellenschleife
Berechnen Sie den Hash-Wert des Join-Schlüssels
Fügen Sie die Zeile in den entsprechenden Hash-Bucket ein.
Ende der Schleife;
2) scannt dann die großen Tabellen und vergleicht den Hash-Wert (der Zeilen aus der großen Tabelle) mit dieser Hash-Tabelle, um die verbundenen Zeilen zu finden. Die große Tabelle wird Prüftabelle genannt
Sondenphase
Für jede Zeile in der großen Tabellenschleife
Berechnen Sie den Hash-Wert auf dem Join-Schlüssel
Untersuchen Sie die Hash-Tabelle nach dem Hash-Wert
Wenn eine Übereinstimmung gefunden wird
Zeilen zurückgeben
Schleife beenden;
Die obige Erklärung gilt, wenn die zu entwickelnde Hash-Tabelle vollständig in den Speicher passt. Wenn die Hash-Tabelle zu groß ist, um in den verfügbaren Speicher zu passen, dann führt Oracle die Verarbeitung auf etwas andere Weise durch.
Grundsätzlich, wenn die Hash-Tabelle ist zu groß, um in den verfügbaren Speicher zu passen. Oracle hat einen Mechanismus, um sie in Stapeln (als Partitionen bezeichnet) auf der Festplatte zu speichern und die Sondentabelle in übereinstimmenden Stapeln auf der Festplatte zu speichern, um dann stückweise zwischen übereinstimmenden Stapeln zu verbinden
Grundsätzlich muss Oracle den TEMP-Tablespace verwenden, wenn sich der Hash-Bereich füllt. Oracle wählt die größte Partition mit im Hash und schreibt diese in TEMP. Oracle behält einen Bitmap-ähnlichen Index der gesamten Hash-Tabelle im Speicher. Dieser Index weiß nur, dass es für einen bestimmten Hash-Bucket (Position in der Hash-Tabelle) einen Wert gibt oder nicht. Aber der Index hat nicht den tatsächlichen Wert.
Wenn also eine Zeile aus der zweiten oder Sondierungstabelle zu einem dieser Orte gehasht wird, ist das einzige, was bekannt ist, dass es eine potenzielle Übereinstimmung gibt. Der Prozess des Erstellens der Hash-Tabelle wird fortgesetzt, bis die gesamte Hash-Tabelle fertig ist. Ein Teil der Hash-Tabelle befindet sich im Arbeitsspeicher und ein Teil auf der Festplatte
Jetzt beginnt das Orakel mit dem Lesen der Sonde oder einer anderen Tabelle und beginnt mit der Erstellung des Hashs des Join-Schlüssels. Wenn der Hash-Schlüssel mit dem Hash im Speicher übereinstimmt, ist der Join abgeschlossen und die Zeile wird zurückgegeben. Wenn die Zeile die potenzielle Übereinstimmung ist, dann das Orakel speichert diese Zeile im TEMP-Tablespace im selben Partitionierungsschema wie die Daten der ersten Zeile.
Sobald der erste Durchgang der gesamten sekundären Tabelle abgeschlossen ist und alle Zeilen in der Hash-Tabelle im Speicher angegeben sind, beginnt Oracle mit der Suche nach der übereinstimmenden Partition auf der Festplatte, verarbeitet jede Partition nacheinander und liest die Zeilen im Speicher und die Ausgabe verarbeiten
Hash Join Oracle-Beispiel:
select /* +use_hash( a b) */ a.emp_no,b.dept_no,b.dept_name from emp a,dept_b where a.dept_no=b.dept_no;Plan---------- ---------------------------------------SELECT STATEMENTHASH JOINTABLE ZUGANG VOLLSTÄNDIG EMPTABLE ZUGANG VOLLSTÄNDIG ABTEILUNGWie Hash-Join in Oracle verarbeitet wird
1) Erste EMP-Tabelle wird gescannt und gehasht
2) Die Dept-Tabelle wird für jede Zeile gescannt und Hash wird für den Join erstellt, wobei Dept_no beibehalten wird
3) Dept_no-Hash wird in der Hash-Tabelle abgeglichen , wenn eine Übereinstimmung gefunden wird, werden verbundene Zeilen zurückgegebenOracle Hash Join-Hinweis
Oracle hat den Hinweis use_hash bereitgestellt, um die Verwendung von Hash-Joins zu erzwingen.
Usageselect /* +use_hash(table alias) */ ......Dies teilt dem Optimierer mit, dass die zu verwendende Join-Methode, wenn „table_alias“ die nächste Zeilenquelle in der Join-Reihenfolge ist, ein Hash-Join sein sollte; es teilt dem Optimierer jedoch nicht mit, ob diese Zeilenquelle als Erstellungstabelle oder als Prüftabelle verwendet werden soll.
Um anzugeben, wie die Zeilenquelle verwendet wird, benötigen Sie einen zweiten Hinweis:no_swap_join_inputs(“table_alias”), wenn Sie möchten, dass Oracle die Zeilenquelle als Sondentabelle verwendet, oder swap_join_inputs(“table_alias”), wenn Oracle sie als Build verwenden soll Tabelle
Einige wichtige Punkte zum Hash-Join in Oracle
1) Die Ausgabe des Hash-Join-Ergebnisses erfolgt nicht sofort, da das Hash-Join beim Erstellen der Hash-Tabelle blockiert wird. Sobald die Erstellung der Hash-Tabelle abgeschlossen ist, werden die Zeilen schneller zurückgegeben.
2) Hash-Joins werden häufig mit dem ALL_ROWS-Optimierer angezeigt Modus, weil es nach dem Modell funktioniert, Ergebnisse anzuzeigen, nachdem alle Zeilen von mindestens einer der Tabellen in Hash-Tabellen gehasht wurden. P>Kosten für den Hash-Join =Kosten für das Lesen von Tabelle A + Kosten für das Lesen von Tabelle B + ein wenig Verarbeitung im Speicher
Unterschied zwischen Nested Loop und Hash Join
Hash-Join | Verschachtelte Verknüpfung |
Hash-Joins werden verwendet, wenn das Joinen großer Tabellen erfolgt oder wenn die Joins die meisten Zeilen der verknüpften Tabellen erfordern. Dies wird nur für Gleichheitsverknüpfungen verwendet | Der NESTED LOOPS Join ist ein Join-Vorgang, der eine Zeile aus der ausgewählten Anfangszeilenquelle auswählt und die Werte dieser Zeilenquelle verwendet, um in die verbundene Zeilenquelle einzudringen oder daraus auszuwählen, um nach der übereinstimmenden Zeile zu suchen. -Am besten für Transaktionen vom Typ OLTP |
Hash-Operation ist normalerweise effizient für die beiden Datensätze, wenn viele Datensätze zurückgegeben werden. | Wenn ein Datensatz keine oder nur wenige Datensätze zurückgibt und ein anderer Datensatz mithilfe der Indexoperation abgeglichen werden kann, dann ist Nested Loop Join effizienter |
Möglicherweise sehen Sie mehr Hash-Joins, die mit dem ALL_ROWS-Optimierungsmodus verwendet werden, da er nach dem Modell funktioniert, Ergebnisse anzuzeigen, nachdem alle Zeilen von mindestens einer der Tabellen in der Hash-Tabelle gehasht wurden. | td> | Sie werden eine stärkere Verwendung der verschachtelten Schleife sehen, wenn Sie den FIRST_ROWS-Optimierungsmodus verwenden, da er auf dem Modell funktioniert, dass dem Benutzer sofortige Ergebnisse angezeigt werden, während sie abgerufen werden. Es ist nicht erforderlich, das Zwischenspeichern von Daten auszuwählen, bevor sie an den Benutzer zurückgegeben werden. Im Fall von Hash-Joins ist dies erforderlich und wird unten erklärt. |