Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Was ist der Unterschied zwischen einem Hash-Join und einem Merge-Join (Oracle RDBMS )?

Ein "Sort Merge"-Join wird durchgeführt, indem die beiden zu verbindenden Datensätze gemäß den Join-Schlüsseln sortiert und dann zusammengeführt werden. Die Zusammenführung ist sehr billig, aber die Sortierung kann unerschwinglich teuer werden, insbesondere wenn die Sortierung auf die Festplatte übertragen wird. Der Sortieraufwand kann gesenkt werden, wenn auf einen der Datensätze sortiert über einen Index zugegriffen werden kann, allerdings kann der Zugriff auf einen hohen Anteil von Blöcken einer Tabelle über einen Index-Scan im Vergleich zu einem Full-Table-Scan auch sehr teuer werden .

Ein Hash-Join wird durchgeführt, indem ein Datensatz basierend auf Join-Spalten in den Speicher gehasht und der andere gelesen und die Hash-Tabelle auf Übereinstimmungen untersucht wird. Der Hash-Join ist sehr kostengünstig, wenn die Hash-Tabelle vollständig im Speicher gehalten werden kann, wobei die Gesamtkosten kaum mehr betragen als die Kosten für das Lesen der Datensätze. Die Kosten steigen, wenn die Hash-Tabelle in einer One-Pass-Sortierung auf die Festplatte übertragen werden muss, und steigen erheblich für eine Multipass-Sortierung.

(In Pre-10g waren Outer Joins von einer großen zu einer kleinen Tabelle hinsichtlich der Leistung problematisch, da der Optimierer nicht die Notwendigkeit lösen konnte, zuerst auf die kleinere Tabelle für einen Hash-Join zuzugreifen, aber zuerst auf die größere Tabelle für einen Outer Join. Folglich waren Hash-Joins in dieser Situation nicht verfügbar).

Die Kosten für einen Hash-Join können reduziert werden, indem beide Tabellen nach dem/den Join-Schlüssel(n) partitioniert werden. Dadurch kann der Optimierer schlussfolgern, dass Zeilen aus einer Partition in einer Tabelle nur eine Übereinstimmung in einer bestimmten Partition der anderen Tabelle finden, und für Tabellen mit n Partitionen wird der Hash-Join als n unabhängige Hash-Joins ausgeführt. Dies hat folgende Auswirkungen:

  1. Die Größe jeder Hash-Tabelle wird reduziert, wodurch die maximal benötigte Speichermenge reduziert wird und möglicherweise die Notwendigkeit entfällt, dass die Operation temporären Speicherplatz benötigt.
  2. Für parallele Abfrageoperationen wird die Menge an prozessübergreifendem Messaging erheblich reduziert, wodurch die CPU-Auslastung reduziert und die Leistung verbessert wird, da jeder Hash-Join von einem Paar von PQ-Prozessen durchgeführt werden kann.
  3. Für nicht-parallele Abfrageoperationen wird der Speicherbedarf um den Faktor n reduziert, und die ersten Zeilen werden früher aus der Abfrage projiziert.

Beachten Sie, dass Hash-Joins nur für Equi-Joins verwendet werden können, Merge-Joins jedoch flexibler sind.

Wenn Sie große Datenmengen in einem Equi-Join zusammenführen, ist im Allgemeinen ein Hash-Join die bessere Wahl.

Dieses Thema wird in der Dokumentation sehr gut behandelt.

http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/optimops.htm#i51523

12.1-Dokumentation:https://docs.oracle.com/database/121/TGSQL/tgsql_join.htm