Łączenie „sortowanie scalające” jest wykonywane przez posortowanie dwóch zestawów danych, które mają zostać połączone, zgodnie z kluczami łączenia, a następnie połączenie ich ze sobą. Scalanie jest bardzo tanie, ale sortowanie może być zaporowo drogie, zwłaszcza jeśli sortowanie rozlewa się na dysk. Koszt sortowania można obniżyć, jeśli dostęp do jednego z zestawów danych można uzyskać w posortowanej kolejności za pomocą indeksu, chociaż dostęp do dużej części bloków tabeli za pomocą skanowania indeksu może być również bardzo kosztowny w porównaniu z pełnym skanowaniem tabeli .
Złączenie haszujące jest wykonywane przez haszowanie jednego zestawu danych do pamięci w oparciu o kolumny sprzężenia i czytanie drugiego oraz sprawdzanie tabeli haszującej pod kątem dopasowań. Łączenie mieszające jest bardzo tanie, gdy tablicę mieszającą można przechowywać w całości w pamięci, a całkowity koszt wynosi niewiele więcej niż koszt odczytu zestawów danych. Koszt rośnie, jeśli tablica mieszająca musi zostać rozrzucona na dysk w sortowaniu jednoprzebiegowym i znacznie wzrasta w przypadku sortowania wieloprzebiegowego.
(W wersjach sprzed 10g sprzężenia zewnętrzne z dużej do małej tabeli były problematyczne pod względem wydajności, ponieważ optymalizator nie mógł rozwiązać potrzeby uzyskania najpierw dostępu do mniejszej tabeli w przypadku sprzężenia mieszającego, ale najpierw do większej tabeli w przypadku sprzężenia zewnętrznego. W związku z tym łączenia haszujące nie były dostępne w tej sytuacji).
Koszt łączenia mieszającego można zmniejszyć, dzieląc obie tabele na klucze łączenia. Pozwala to optymalizatorowi wywnioskować, że wiersze z partycji w jednej tabeli znajdą dopasowanie tylko w określonej partycji drugiej tabeli, a dla tabel mających n partycji łączenie mieszające jest wykonywane jako n niezależnych złączeń mieszających. Ma to następujące skutki:
- Rozmiar każdej tablicy mieszającej jest zmniejszony, co zmniejsza maksymalną wymaganą ilość pamięci i potencjalnie eliminuje potrzebę tymczasowego miejsca na dysku.
- W przypadku równoległych operacji zapytań ilość komunikatów międzyprocesowych jest znacznie zmniejszona, zmniejszając użycie procesora i poprawiając wydajność, ponieważ każde połączenie haszujące może być wykonane przez jedną parę procesów PQ.
- W przypadku nierównoległych operacji zapytań wymagania dotyczące pamięci są zmniejszane o współczynnik n, a pierwsze wiersze są rzutowane z wcześniejszego zapytania.
Należy pamiętać, że łączenia haszujące mogą być używane tylko do połączeń ekwiwalentnych, ale łączenia przez scalanie są bardziej elastyczne.
Ogólnie rzecz biorąc, jeśli łączysz duże ilości danych w equi-join, to połączenie haszowe będzie lepszym zakładem.
Ten temat jest bardzo dobrze omówiony w dokumentacji.
http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/optimops.htm#i51523
Dokumenty 12.1:https://docs.oracle.com/database/121/TGSQL/tgsql_join.htm