2016년 12월 1일 목요일

[오라클교육,SQL교육,튜닝교육학원추천_탑크리에듀][오라클 조인]중첩루프조인(Neted Loop Join)이란?, Driving/Inner Table, Oracle Join

[오라클 조인]중첩루프조인(Neted Loop Join)이란?, Driving/Inner Table, Oracle Join
Nested Loop Join 
 중첩루프조인(Nested Loop Join)이란? 
부분 범위처리에 유리한 조인 방식으로 두개 이상의 테이블 구조에서 하나의 테이블(Driving/Outer Table)을 기준으로 순차적으로 다른 테이블(Driven/Inner Table) ROW를 조인하여 원하는 데이터를 추출하는 방식의 조인이다추출되는 ROW가 많아 질수록 성능이 현저히 떨어지며 성능을 높이기 위해서는 Drving Table의 크기가 작을수록 유리하며 Inner Table은 조인되는 컬럼으로 인덱스가 구성이 되어 있어야 한다즉 드라이빙 테이블의 크기를 어느 정도 줄이느냐, Inner Table에 인덱스가 있느냐에 따라 성능이 결정되는 방식이다. 
Inner Table에서 인덱스를 사용한다면 검색알고리즘을 적용할 수도 있으며 한번 읽혀진 블록은 DataBase Buffer Cache에 남겨져 있기에 반복적인 I/O양은 최소화 될 수 있다만약 Inner Table의 크기가 작다면 메모리에 올려서 검색하는 것이 좋지만 현실적으로 대용량의 데이터 처리에서는 이러한 처리는 어렵다.

Nested Loop join에서는 Inner Table을 랜덤 액세스에 의해 접근하므로 랜덤액세스 되는  ROW가 많다면 수행속도가 저하된다만약 Inner Table Join column에 인덱스가 없다면 Hsah or Merge Join을 이용해야 한다또한 Inner Table에서 조인 컬럼은 Unique Column 일수록  성능은 좋다.

[특징]
- Driving Table 인덱스 엑세스의 경우 첫 번째 매칭되는 데이터를 제외하면 나머지 데이터는 스캔 한다.
조인작업은 모두 랜덤 엑세스
조인방향에 다라 인덱스가 선택적으로 사용된다.
주어진 상수 값에 의해 범위가 줄어드는 것은 아니며 값을 받아 처리 범위를 결정한다.
조인 후 마지막 체크되는 조건은 수행속도에 영향을 준다.
부분범위 처리시에 사용하며 확실히 범위를 줄여 줄 조건들이 있을 때 사용
- Driving Table이 대량이거나 Inner Table에서 조인되는 데이터가 대량인 경우 Sort Merge, Hash Join 검토할 것


[처리방식] 
다음과 같은 SQL을 생각해 보자. 
-       Emp table deptno, dept table의 deptno 컬럼은 인덱스 존재
-       Dept 

Select /*+ ordered use_nl(e) */
e.ename, e.deptno, d.dname
 From  dept d, emp e                 //dept 테이블이 드라이빙 테이블
Where  e.deptno = d.deptno
and e.job = ‘CLERK’
and d.deptno = 10
and d.loc like ‘서울%’


[처리순서]

1.     Dept deptno 인덱스를 경유하여 deptno = 10인 데이터를 인덱스 범위(index range)추출
2.     처음 레코드 Access
3.     Dept의 deptno인덱스의 ROWID를 이용하여 dept 테이블의 원본데이터 몽땅 추출 후 상수 값으로 두고이 값을 통해 d.loc = ‘서울%’인지 확인 후 맞으면 다음수행 아니면 2에에부터 다시 시작
4.     e.deptno = d.deptno를 수행한다현재 d.deptno 10이므로 상수처리되어 e.deptno =10인 모양이 되며 emp table의 데이터 추출 job=’CLERK’인지 확인하여 맞으면 select 아니면 버림
5.     2부터 다시 시작

댓글 없음:

댓글 쓰기