Obsah
Co je Neted Loop Join v Oracle
-Pro každý řádek ve zdroji prvního řádku získáte přístup ke všem řádkům ze zdroje druhého řádku.
-Připojení NESTED LOOPS je operace spojení, která vybere řádek z vybraného zdroje počátečního řádku a použije hodnoty tohoto zdroje řádků. pro najetí nebo výběr ze zdroje spojených řádků při hledání shodného řádku.
-Nejlepší pro transakce typu OLTP
-Bude nejrychlejší, pokud jsou řádky vrácené z první tabulky malé
– Nested Loop Join v Oracle 11g funguje odlišně. Podrobnosti o tom jsou uvedeny v tomto článku
jak funguje spojení vnořené smyčky v oracle
-Optimalizátor oracle nejprve určí řídicí tabulku a označí ji jako vnější smyčku. Toto je zdroj řídicích řádků. Vytváří sadu řádků pro řízení podmínky spojení. Zdrojem řádků může být tabulka přístupná pomocí indexového skenování nebo úplného prohledávání tabulky. Řady mohou být vyrobeny z jakékoli jiné operace. Například výstup ze spojení Nested Loop Join lze použít jako zdroj řádků.
-Optimalizátor označí jinou tabulku jako vnitřní smyčku. To je iterováno pro každý řádek vrácený z vnější smyčky. Toto je operace přístupu k tabulce a v ideálním případě by to mělo být skenování indexu.
-Operace prováděná VNITŘNÍ tabulkou se opakuje pro každý řádek vrácený ve VNĚJŠÍ tabulce
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
Příklad spojení vnořené smyčky
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 se zpracovává
(1) Přečtěte si první řádek v DEPT
(2) Proveďte indexové skenování na EMP_N1 pro shodu dept_no a získejte první rowid
(3) Vyhledejte odkazovaný řádek v EMP a připojte informace a poskytněte výstup
(4) Opakujte operaci 2,3 pro každý vrácený rowid
(5) Opakujte operaci 1,2,3,4 pro všechny řádky v DEPT
for x in (výběr z oddělení tabulky)
loop
pro řádek v (výběr z tabulky emp )
loop
vrátí se spojené výstupní řádky, kde je splněna podmínka
end smyčka
ukončit smyčku
Zde by přístupová metoda pro výběr z tabulky emp byla přes index scan
Pokud se optimalizátor rozhodne použít jinou metodu spojení, můžete použít nápovědu USE_NL(A B), kde A a B jsou aliasy tabulek. se připojují.
Výpočty nákladů
Ve spojení NESTED LOOPS je pro každý řádek v sadě vnějších řádků přístup k sadě vnitřních řádků, aby se našly všechny odpovídající řádky ke spojení. Proto je u tohoto typu spojení vnitřní sada řádků přístupná tolikrát, kolikrát je počet řádků ve vnější sadě řádků.
Cena :náklady na přístup k tabulce A + počet řádků vrácených z tabulky A X náklady na přístup k tabulce B
Bude to tedy nákladově efektivní, pokud se z vnější tabulky vrátí malé řádky a operace přístupu k vnitřní tabulce bude probíhat prostřednictvím jedinečného skenování nebo skenování malého rozsahu indexů
Nová metoda pro spojení Nested Loop Join v Oracle 11g
SELECT STATEMENT NESTED LOOPS NESTED LOOPS TABLE ACCESS FULL DEPT INDEX UNIQUE SCAN EMP_IDX TABLE ACCESS BY INDEX ROWID EMP
Dokumentace Oracle to říká
Pokud index nebo blok tabulky není ve vyrovnávací paměti a je potřeba ke zpracování spojení, je vyžadován fyzický I/O. V Oracle Database 11g Release 1 (11.1) může Oracle Database dávkovat více fyzických I/O požadavků a zpracovávat je pomocí vektorového I/O namísto zpracování jednoho po druhém. Jako součást nové implementace pro spojení vnořených smyček se mohou v plánu provádění objevit dva zdroje řádků spojení NESTED LOOPS, kde by se v předchozích verzích objevil pouze jeden. V takových případech Oracle Database přidělí jeden zdroj řádků spojení NESTED LOOPS ke spojení hodnot z tabulky na vnější straně spojení s indexem na vnitřní straně. Zdroj druhého řádku je přidělen ke spojení výsledku prvního spojení, který zahrnuje rowids uložené v indexu oracle, s tabulkou na vnitřní straně spojení”
Vnější spojení Nested Loops v Oracle
-Podobné jako vnořená smyčka
-Řádky se vrací, i když vnitřní smyčka nemá žádné řádky splňující kritéria
-Na rozdíl od vnořené smyčky, která může být řízena z kterékoli z tabulek, je to jednosměrné spojení
a =b(+) vždy půjde do a před b, to může mít za následek dražší plán (možná mimo NL)
(+) vždy jde na straně nedostatků
Také čte
Hash Join
Metoda připojení v Oracle
https://en.wikipedia.org/wiki/Nested_loop_join