Jaka jest różnica między połączeniem hashowym a połączeniem merge (Oracle RDBMS?

Jakie są zyski/straty wydajności między połączeniami hash i połączeniami merge, w szczególności w Oracle RDBMS?

Author: David Aldridge, 2009-07-11

2 answers

Połączenie "sort merge" jest wykonywane przez sortowanie dwóch zestawów danych, które mają być połączone zgodnie z kluczami join, a następnie scalanie ich razem. Scalanie jest bardzo tanie, ale sortowanie może być zbyt drogie, zwłaszcza jeśli sortowanie rozleje się na dysk. Koszt sortowania można obniżyć, jeśli jeden z zestawów danych jest dostępny w kolejności sortowania 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 do pełnej tabeli skan.

Połączenie hashowe jest wykonywane przez zahaszowanie jednego zestawu danych do pamięci na podstawie kolumn join i odczytanie drugiego i sprawdzenie tabeli hash pod kątem dopasowania. Połączenie hash jest bardzo niskie, gdy tabela hash może być przechowywana w całości w pamięci, a całkowity koszt jest niewiele większy niż koszt odczytu zbiorów danych. Koszt wzrasta, jeśli tabela hash musi zostać przelana na dysk w sortowaniu jednokrotnym, a znacznie wzrasta w przypadku sortowania wielostopniowego.

(W pre-10g, zewnętrzne połączenia od dużej do małej tabeli były problematyczne pod względem wydajności, ponieważ optymalizator nie mógł rozwiązać potrzeby uzyskania dostępu najpierw do mniejszej tabeli dla połączenia hashowego, ale najpierw do większej tabeli dla połączenia zewnętrznego. W związku z tym połączenia hashowe nie były w tej sytuacji dostępne).

Koszt połączenia hashowego można zmniejszyć, dzieląc obie tabele na klawisze join. Pozwala to optymalizatorowi wywnioskować, że wiersze z partycji w jednej tabeli znajdą dopasowanie tylko w określonej partycji inne tabele, a dla tabel posiadających n partycji połączenie hashowe jest wykonywane jako n niezależnych złączy hashowych. Ma to następujące skutki:

  1. rozmiar każdej tabeli skrótów jest zmniejszony, co zmniejsza maksymalną ilość wymaganej pamięci i potencjalnie eliminuje potrzebę operacji wymagającej tymczasowego miejsca na dysku.
  2. W przypadku równoległych operacji zapytań ilość wiadomości między procesami jest znacznie zmniejszona, zmniejszając zużycie procesora i poprawiając wydajność, ponieważ każde połączenie hashowe może być wykonywane przez jedną parę procesów PQ.
  3. dla operacji zapytań nie-równoległych zapotrzebowanie na pamięć jest zmniejszone o współczynnik n, a pierwsze wiersze są wyświetlane z zapytania wcześniej.

Należy zauważyć, że połączenia hashowe mogą być używane tylko dla połączeń równolicznych, ale połączenia scalające są bardziej elastyczne.

Ogólnie rzecz biorąc, jeśli łączysz duże ilości danych w equi-join, to połączenie hashowe będzie lepszym zakładem.

Ten temat jest bardzo dobrze omówiony w dokumentacja.

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

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

 67
Author: David Aldridge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-23 10:11:32

Chcę tylko edytować to dla potomności, że tagi do oracle nie zostały dodane, gdy odpowiedziałem na to pytanie. Moja odpowiedź bardziej pasowała do MS SQL.

Merge join jest najlepszy z możliwych, ponieważ wykorzystuje kolejność, co skutkuje pojedynczym przejściem w dół tabel do połączenia. Jeśli masz dwie tabele (lub indeksy obejmujące), które mają taką samą kolejność, np. klucz podstawowy i indeks tabeli na tym kluczu, to połączenie merge spowoduje, jeśli to zrobisz akcja.

Hash join jest kolejnym najlepszym rozwiązaniem, Jak to zwykle robi się, gdy jedna tabela ma małą liczbę (względnie) elementów, skutecznie tworzy tabelę tymczasową z hashami dla każdego wiersza, która jest następnie przeszukiwana w sposób ciągły, aby utworzyć join.

Najgorszym przypadkiem jest zagnieżdżona pętla, która jest porządkiem (n * m), co oznacza, że nie ma kolejności ani rozmiaru do wykorzystania, a połączenie jest po prostu, dla każdego wiersza w tabeli x, wyszukaj w tabeli y połączenia do wykonania.

 6
Author: Spence,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-28 07:28:16