Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jaka jest różnica między łączeniem mieszającym a łączeniem scalającym (Oracle RDBMS)?

Łą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:

  1. Rozmiar każdej tablicy mieszającej jest zmniejszony, co zmniejsza maksymalną wymaganą ilość pamięci i potencjalnie eliminuje potrzebę tymczasowego miejsca na dysku.
  2. 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.
  3. 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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przyspiesz operacje wstawiania zbiorczego dzięki NHibernate

  2. utwórz tabelę z sequence.nextval w oracle

  3. Obracanie danych za pomocą dwóch kolumn

  4. Jak zadeklarować parametry wejścia-wyjścia w procedurze/funkcji przechowywanej w programie SQL Server?

  5. Jak dodać wiodące zero do liczby w zapytaniu Oracle SQL?