2013년 10월 23일 수요일

[ORACLE EXECUTION PLAN]오라클 실행계획 해석하기(Nested Loops Join)

[ORACLE EXECUTION PLAN]오라클 실행계획 해석하기(Nested Loops Join) , 중첩루프조인



 실행계획 해석하기(Nested Loops Join)

실행 계획을 보면 Nested Loop라는 것이 보이는데 그 바로 밑에 나온 문장이 드라이빙 테이블(OUTER TABLE)이며 그 아래 문장이 비드라이빙 테이블(INNER TABLE) 입니다.

다음의 예를 보도록 하죠…

SQL> SELECT E.EMPNO,
              E.ENAME,
              D.DNAME,
              D.LOC
      FROM  EMP E, DEPT D
      WHERE  E.DEPTNO = D.DEPTNO
      ORDER BY EMPNO;
9i)

Execution Plan
------------------------------------------------------
SELECT STATEMENT Optimizer=CHOOSE
 SORT (ORDER BY)
TABLE ACCESS (BY INDEX ROWID) OF ‘EMP’
NESTED LOOPS
    TABLE ACCESS (FULL) OF ‘DEPT’
    INDEX (RANGE SCAN) OF ‘IDX_EMP_DEPTNO’ (NON UNIQUE)


8i)

Execution Plan
------------------------------------------------------
SELECT STATEMENT Optimizer=CHOOSE
 SORT (ORDER BY)
NESTED LOOPS
  TABLE ACCESS (FULL) OF ‘DEPT’
  TABLE ACCESS (BY INDEX ROWIDD) OF ‘EMP’
    INDEX (RANGE SCAN) OF ‘IDX_EMP_DEPTNO’ (NON UNIQUE)

중첩 루프 조인의 경우 들여쓰기 보다는 드라이빙 테이블을 시작시점으로 해석을 해야 하는데 위에서 DEPT 테이블이 드라이빙 테이블 입니다.

즉 DEPT 테이블을 FULL SCAN 하면서 추출되는 ROW 하나마다 EMP TABLE의 인덱스(IDX_EMP_DEPTNO, EMP 테이블의 DEPTNO에 대한 인덱스)를 이용하여 원하는 ROW를 추출하는 것입니다. 이렇게 얻어진 결과에 대해 SORT(ORDER BY)를 하여 최종적인 결과를 내놓는 것입니다.

참고로 오라클에서는 조인 컬럼들에 대해 인덱스가 존재하지 않는다면 중첩 루프 조인(Nested Loop Join)이 아닌 다음과 같은 실행계획을 만들게 됩니다. (아래에서는 조인 컬럼에 변형을 가해 인덱스가 사용되지 않도록 하였습니다)

SQL> SELECT E.EMPNO,
              E.ENAME,
              D.DNAME,
              D.LOC
      FROM  EMP E, DEPT D
      WHERE  RTRIM(E.DEPTNO) = RTRIM(D.DEPTNO)
      ORDER BY EMPNO;


Execution Plan
------------------------------------------------------
SELECT STATEMENT Optimizer=CHOOSE
 SORT (ORDER BY)
MERGE JOIN
  SORT(JOIN)
    TABLE ACCESS(FULL) OF ‘DEPT’
SORT(JOIN)
    TABLE ACCESS(FULL) OF ‘EMP’


위의 경우는 DEPT 테이블을 FULL SCAN해서 나온 결과 SET와 EMP 테이블을 FULL SCAN 해서 찾은 결과 SET을 모아서 조건을 만족하는 ROW를 추출하는 MERGE JOIN 방식으로 실행 계획이 생성 되었습니다.


오라클자바커뮤니티에서 설립한 개발자교육6년차 오엔제이프로그래밍 실무교육센터(오라클SQL,튜닝,힌트,자바프레임워크,안드로이드,아이폰,닷넷 실무개발강의)  


[기타 다른 강좌는 아래 해당 카테고리를 클릭해주세요]

 

댓글 없음:

댓글 쓰기