Spis treści
Co to jest hash Join w Oracle?
Sprzężenia mieszające są używane, gdy łączysz duże tabele lub gdy złączenia wymaga większości połączonych wierszy tabel. Jest to używane tylko do połączeń równościowych
Algorytm łączenia Oracle Hash
1) Optymalizator używa mniejszej z dwóch tabel do zbudowania tablicy mieszającej w pamięci. Mała tablica nazywa się tablicą kompilacji
Faza budowy
Dla każdego wiersza w małej pętli tabeli
Oblicz wartość skrótu klucza sprzężenia
Wstaw wiersz w odpowiednim zasobniku skrótu.
Zakończ pętlę;
2) następnie skanuje duże tabele i porównuje wartość skrótu (wierszy z dużej tabeli) z tą tabelą, aby znaleźć połączone wiersze. Duża tabela nazywana jest tabelą sond
Faza sondy
Dla każdego wiersza w pętli dużej tabeli
Oblicz wartość skrótu klucza sprzężenia
Sprawdź tabelę skrótu pod kątem wartości skrótu
Jeśli znaleziono dopasowanie
Zwróć wiersze
Zakończ pętlę;
Powyższe wyjaśnienie jest prawdziwe, gdy rozwijana tablica mieszająca mieści się całkowicie w pamięci. Jeśli tablica mieszająca jest zbyt duża, aby zmieścić się w dostępnej pamięci, Oracle wykonuje przetwarzanie w nieco inny sposób.
Zasadniczo, jeśli tablica mieszająca jest zbyt duży, aby zmieścić się w dostępnej pamięci Oracle ma mechanizm zapisywania go na dysku w partiach (zwanych partycjami) i zapisywania tabeli sond na dysku w pasujących partiach, a następnie mądrze łączy elementy między pasującymi partiami
Zasadniczo, gdy obszar haszowania się zapełni, Oracle będzie wymagało użycia obszaru tabel TEMP. Oracle wybierze największą partycję z haszem i zapisze ją w TEMP.Oracle przechowuje w pamięci indeks podobny do bitmapy całej tabeli mieszania. Ten indeks wie tylko, że dla danego zbioru haszującego (lokalizacja w tabeli haszującej) istnieje lub nie ma wartości. Ale indeks nie ma rzeczywistej wartości.
Dlatego jeśli wiersz z drugiej lub sondującej tabeli haszuje do jednej z tych lokalizacji, wiadomo tylko, że istnieje potencjalna zgodność. Proces budowania tablicy mieszającej trwa do zakończenia całej tablicy mieszającej. Część tablicy mieszającej jest w pamięci, a część na dysku
Teraz Oracle zaczyna czytać sondę lub inną tabelę i zaczyna tworzyć skrót klucza łączenia. Jeśli klucz skrótu pasuje do skrótu w pamięci, łączenie jest zakończone i zwracany jest wiersz. Jeśli wiersz jest potencjalnym dopasowaniem, wtedy oracle zapisze ten wiersz w obszarze tabel TEMP w tym samym schemacie partycjonowania, w którym były przechowywane dane pierwszego wiersza.
Po zakończeniu pierwszego przejścia całej tabeli pomocniczej i podaniu wszystkich wierszy w tabeli mieszania w pamięci, Oracle rozpocznie wyszukiwanie pasującej partycji na dysku i przetworzy każdą partycję po kolei i odczyta wiersze w pamięci i przetworzyć wynik
Hash dołącz do Oracle Przykład:
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 STATEMENT HASH JOIN TABLE ACCESS FULL EMP TABLE ACCESS FULL DEPT
Jak przetwarzane jest dołączenie haszujące w Oracle
1) Pierwsza tabela EMP jest skanowana i haszowana
2) Tabela dept jest skanowana dla każdego wiersza i tworzony jest hash dla połączenia z zachowaniem dept_no
3) hash dept_no jest dopasowany w tabeli hash , jeśli zostanie znalezione dopasowanie , zwracane są połączone wiersze
Podpowiedź łączenia haszującego Oracle
Firma Oracle udostępniła wskazówkę use_hash, aby wymusić użycie łączenia haszującego.
Usage select /* +use_hash(table alias) */ ......
To mówi optymalizatorowi, że metoda łączenia, która ma być użyta, gdy „alias_tabeli” jest źródłem następnego wiersza w kolejności łączenia, powinna być łączeniem mieszającym; jednak nie mówi optymalizatorowi, czy źródło wiersza powinno być użyte jako tabela kompilacji czy tabela sond.
Aby określić, w jaki sposób używane jest źródło wiersza, potrzebujesz drugiej wskazówki:no_swap_join_inputs („alias_tabeli”), jeśli Oracle ma używać źródła wierszy jako tabeli sondy, lub swap_join_inputs („alias_tabeli”), jeśli chcesz, aby firma Oracle używała go jako kompilacji stół
Kilka ważnych punktów dotyczących łączenia haszującego w Oracle
1)Wyjście wyniku łączenia mieszającego nie jest natychmiastowe, ponieważ łączenie mieszające jest blokowane podczas tworzenia tablicy mieszającej.Po zakończeniu budowy tablicy mieszającej wiersze są zwracane szybciej
2)połączenia mieszające są często spotykane w optymalizatorze ALL_ROWS tryb, ponieważ działa na modelu wyświetlania wyników po zahaszowaniu wszystkich wierszy przynajmniej jednej z tabel w tablicy mieszającej.
3) Tablica mieszająca jest prywatną pamięcią, więc dostęp do danych nie wiąże się z dużą aktywnością zatrzaskiwania
Koszt połączenia mieszającego =Koszt odczytu tabeli A +koszt odczytu tabeli B + trochę przetwarzania w pamięci
Różnica między zagnieżdżoną pętlą a sprzężeniem mieszającym
Połączenie haszujące | Połączenie zagnieżdżone |
Łączenia haszujące są używane, gdy łączysz duże tabele lub gdy łączenia wymagają większości połączonych wierszy tabel. Jest to używane tylko do łączenia równości | Złączanie zagnieżdżonych pętli to operacja łączenia, która wybiera wiersz z wybranego źródła wiersza początkowego i używa wartości tego źródła wiersza do kierowania do lub wybierania z połączonego źródła wiersza w poszukiwaniu pasującego wiersza. -Najlepsze dla transakcji typu OLTP |
Operacja skrótu jest zwykle wydajna dla dwóch zestawów danych, gdy zwracanych jest wiele rekordów. | Gdy jeden zestaw danych nie ma lub nie ma zwróconej liczby rekordów, a inny zestaw danych można dopasować za pomocą operacji indeksowania, łączenie zagnieżdżonych pętli jest bardziej wydajne |
Możesz zobaczyć więcej łączeń haszujących używanych w trybie optymalizatora ALL_ROWS, ponieważ działa on na modelu wyświetlania wyników po zahaszowaniu wszystkich wierszy co najmniej jednej tabeli w tabeli haszującej. | Większe użycie pętli zagnieżdżonej będzie widoczne podczas korzystania z trybu optymalizatora FIRST_ROWS, ponieważ działa on na modelu pokazującym natychmiastowe wyniki użytkownikowi podczas ich pobierania. Nie ma potrzeby wybierania buforowania jakichkolwiek danych przed ich zwrotem do użytkownika. W przypadku łączenia haszowego jest to potrzebne i jest wyjaśnione poniżej. |