Съдържание
Какво е присъединяване на вложен цикъл в Oracle
-За всеки ред в източника на първия ред има достъп до всички редове от източника на втория ред.
-ВГЛАЖЕНИ ИЗТОЧНИЦИ НА ИЗТОЧНИКА НА ИЗТОЧНИКА НА ВГЛАЖЕНИ ЛИКВИ е операция за свързване, която избира ред от избрания начален източник на ред и използва стойностите на този източник на ред за да влезете или изберете от обединен източник на ред, търсейки съответстващия ред.
-Най-добро за транзакции от тип OLTP
-ще бъде най-бързо, ако редовете, върнати от първата таблица, са малки
-Присъединяването на вложен цикъл в Oracle 11g работи по различен начин. Подробности за него са дадени в тази статия
как работи присъединяването на вложен цикъл в oracle
-Оптимизаторът на Oracle първо определя таблицата за управление и я обозначава като външен цикъл. Това е източникът на задвижващия ред. Той произвежда набор от редове за управление на условието за присъединяване. Източникът на ред може да бъде таблица, достъпна чрез индексно сканиране или пълно сканиране на таблица. Редовете могат да бъдат произведени и от всяка друга операция. Например изходът от свързване на вложен цикъл може да се използва като източник на ред.
-Оптимизаторът определя друга таблица като вътрешен цикъл. Това се повтаря за всеки ред, върнат от външния цикъл. Това е операция за достъп до таблица и в идеалния случай трябва да бъде сканиране на индекс.
-Операцията, извършена от таблица INNER, се повтаря за всеки ред, върнат във 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
Пример за присъединяване на вложен цикъл
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
Как се обработва
(1) Прочетете първия ред в DEPT
(2) Направете сканиране на индекса на EMP_N1 за съвпадение на dept_no и вземете първия ред
(3) Потърсете посочения ред в EMP и съединете информацията и предоставете изход
(4) Повторете операция 2,3 за всеки върнат ред
(5) Повторете операцията 1,2,3,4 за всички редове в DEPT
for x in (избиране от таблица dept)
loop
for row in (select from table emp )
loop
обединените изходни редове се връща, където условието е съвпадащо
end цикъл
краен контур
Тук методът за достъп за избор от таблица emp ще бъде чрез сканиране на индекс
Ако оптимизаторът избере да използва друг метод за присъединяване, можете да използвате подсказката USE_NL(A B), където A и B са псевдоними на таблиците се присъединява.
Изчисления на разходите
При свързване с ВГЛАЖЕНИ ЛИКВИ, за всеки ред от външния набор от редове се осъществява достъп до вътрешния набор от редове, за да се намерят всички съвпадащи редове за присъединяване. Следователно, при този тип свързване, вътрешният набор от редове е достъпен толкова пъти, колкото е броят на редовете във външния набор от редове.
Разходи :цена за достъп до таблица A + брой редове, върнати от таблица A X цена за достъп до таблица B
Така че това ще бъде рентабилно, ако малките редове се връщат от външната таблица и операцията за достъп до вътрешната таблица е чрез уникално сканиране или сканиране на малък диапазон на индекси
Нов метод за присъединяване на вложен цикъл в Oracle 11g
SELECT STATEMENT NESTED LOOPS NESTED LOOPS TABLE ACCESS FULL DEPT INDEX UNIQUE SCAN EMP_IDX TABLE ACCESS BY INDEX ROWID EMP
Документацията на Oracle казва това за
Когато индекс или блок на таблица не е в кеша на буфера и е необходим за обработка на присъединяването, е необходим физически I/O. В Oracle Database 11g Release 1 (11.1), Oracle Database може да групира множество физически I/O заявки и да ги обработва с помощта на векторен I/O вместо да ги обработва една по една. Като част от новата реализация за присъединяване на вложен цикъл, два източника на редове за присъединяване на NESTED LOOPS може да се появят в плана за изпълнение, където само един би се появил в предишни издания. В такива случаи Oracle Database разпределя един източник на редове за присъединяване на NESTED LOOPS, за да обедини стойностите от таблицата от външната страна на съединението с индекса от вътрешната страна. Втори източник на ред се разпределя за обединяване на резултата от първото обединение, което включва редовете, съхранени в индекса на оракула, с таблицата от вътрешната страна на съединението”
Външно присъединяване на вложени цикли в Oracle
-Подобно на вложен цикъл
-Върнати редове, дори ако вътрешният цикъл няма редове, отговарящи на критериите
-За разлика от вложения цикъл, който може да бъде управляван от която и да е от таблиците, това е еднопосочно присъединяване
a =b(+) винаги ще премине към a преди b, това може да доведе до по-скъп план (евентуално извън NL)
(+) винаги отива на недостатъчна страна
Също чете
Hash Join
Метод на присъединяване в Oracle
https://en.wikipedia.org/wiki/Nested_loop_join