Oracle
 sql >> база данни >  >> RDS >> Oracle

Присъединяване на вложен цикъл в Oracle 11g

Съдържание

Какво е  присъединяване на вложен цикъл в 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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да използвате Oracle PLSQL таблици (асоциативен масив или таблица по индекс)

  2. Функцията Concat не работи - невалиден брой аргументи

  3. Как да намеря привилегиите и ролите, предоставени на потребител в Oracle?

  4. Получаване на ORA-03115:неподдържан мрежов тип данни или грешка при представяне при извличане на масив от varchar от анонимен pl/sql

  5. ORA-00903:невалидно име на таблица в PreparedStatement