Spis treści
Co to jest Zagnieżdżone łączenie pętli w Oracle
-Dla każdego wiersza w źródle pierwszego wiersza uzyskaj dostęp do wszystkich wierszy ze źródła drugiego wiersza.
-Złączanie zagnieżdżonych pętli jest operacją łączenia, która wybiera wiersz z wybranego źródła wiersza początkowego i używa wartości tego źródła wiersza wjechać lub wybrać z połączonego źródła wiersza, szukając pasującego wiersza.
-Najlepsze dla transakcji typu OLTP
-najszybciej, jeśli wiersze zwrócone z pierwszej tabeli są małe
-Nested Loop Join w Oracle 11g działa inaczej. Szczegółowe informacje na ten temat znajdują się w tym artykule
jak zagnieżdżone łączenie pętli działa w Oracle
- Optymalizator Oracle najpierw określa tablicę kierującą i wyznacza ją jako pętlę zewnętrzną. Jest to źródło rzędu sterującego. Tworzy zestaw wierszy do sterowania warunkiem połączenia. Źródłem wiersza może być tabela, do której dostęp uzyskuje się za pomocą skanowania indeksu lub pełnego skanowania tabeli. Rzędy można również wyprodukować z dowolnej innej operacji. Na przykład dane wyjściowe z zagnieżdżonego łączenia pętli mogą być użyte jako źródło wiersza.
-Optymalizator wyznacza inną tabelę jako pętlę wewnętrzną. Jest to powtarzane dla każdego wiersza zwróconego z pętli zewnętrznej. Jest to operacja dostępu do tabeli i idealnie powinna być skanowaniem indeksu.
-Operacja wykonywana przez tabelę INNER jest powtarzana dla każdego wiersza zwróconego w tabeli OUTER
for x in (select from outer table) loop for row in (select from inner table ) loop joined output rows is returned where condition is matched end loop end loop
Przykład łączenia w pętlę zagnieżdżoną
select /* +use_nl( a b) */ a.emp_no,b.dept_no,b.dept_name from emp a,dept b where a.dept_no=b.dept_no; SELECT STATEMENT NESTED LOOP TABLE ACCESS FULL DEPT TABLE ACCESS BY INDEX ROWID EMP INDEX RANGE SCAN EMP_N1
Jak to jest przetwarzane
(1) Odczytaj pierwszy wiersz w DEPT
(2) Wykonaj skanowanie indeksu w EMP_N1 w celu dopasowania dept_no i uzyskaj pierwszy wierszid
(3) Poszukaj wiersza, do którego istnieje odwołanie w EMP i dołącz do informacji oraz podaj wyjście
(4) Powtórz operację 2,3 dla każdego zwróconego wiersza
(5) Powtórz operację 1,2,3,4 dla wszystkich wierszy w DEPT
for x in (wybierz z działu tabeli)
pętla
dla wiersza w (wybierz z tabeli emp )
pętla
zwracane są połączone wiersze wyjściowe, gdy warunek jest spełniony
koniec pętla
zakończ pętlę
Tutaj metoda dostępu do select from table emp polegałaby na skanowaniu indeksu
Jeśli optymalizator wybierze inną metodę łączenia, możesz użyćpodpowiedzi USE_NL(A B), gdzie A i B sąaliasami tabel dołączanie.
Obliczenia kosztów
W łączeniu NESTED LOOPS dla każdego wiersza w zewnętrznym zestawie wierszy uzyskuje się dostęp do wewnętrznego zestawu wierszy w celu znalezienia wszystkich pasujących wierszy do połączenia. Dlatego w tego typu sprzężeniu dostęp do wewnętrznego zestawu wierszy jest uzyskiwany tyle razy, ile jest wierszy w zewnętrznym zestawie wierszy.
Koszt :koszt dostępu do tabeli A + liczba wierszy zwróconych z tabeli A X koszt dostępu do tabeli B
Będzie to więc opłacalne, jeśli małe wiersze są zwracane z tabeli zewnętrznej, a operacja dostępu do tabeli wewnętrznej odbywa się poprzez unikalne skanowanie lub skanowanie małego zakresu indeksów
Nowa metoda łączenia zagnieżdżonych pętli w Oracle 11g
SELECT STATEMENT NESTED LOOPS NESTED LOOPS TABLE ACCESS FULL DEPT INDEX UNIQUE SCAN EMP_IDX TABLE ACCESS BY INDEX ROWID EMP
Dokumentacja Oracle mówi o tym
Gdy indeks lub blok tabeli nie znajduje się w buforze pamięci podręcznej i jest potrzebny do przetworzenia złączenia, wymagane jest fizyczne wejście/wyjście. W Oracle Database 11g Release 1 (11.1), Oracle Database może grupować wiele fizycznych żądań we/wy i przetwarzać je przy użyciu wektorowych we/wy zamiast przetwarzać je pojedynczo. W ramach nowej implementacji złączeń zagnieżdżonych w pętli w planie wykonania mogą pojawić się dwa źródła wierszy złączeń zagnieżdżonych, z których w poprzednich wersjach pojawiało się tylko jedno. W takich przypadkach Oracle Database przydziela jedno źródło wiersza złączenia NESTED LOOPS, aby połączyć wartości z tabeli po zewnętrznej stronie złączenia z indeksem po stronie wewnętrznej. Drugie źródło wiersza jest przydzielane do łączenia wyniku pierwszego łączenia, które obejmuje wiersze przechowywane w indeksie oracle, z tabelą po wewnętrznej stronie łączenia”
Zewnętrzne złącze zagnieżdżonych pętli w Oracle
-Podobne do zagnieżdżonej pętli
-Wiersze zwracane, nawet jeśli wewnętrzna pętla nie ma żadnych wierszy spełniających kryteria
-W przeciwieństwie do zagnieżdżonej pętli, która może być sterowana z którejkolwiek z tabel, jest to połączenie w jedną stronę
a =b(+) zawsze przejdzie do a przed b, może to skutkować droższym planem (prawdopodobnie innym niż NL)
(+) zawsze idzie na stronę niedoborów
Też czyta
Hash Join
Metoda łączenia w Oracle
https://en.wikipedia.org/wiki/Nested_loop_join