본문 바로가기

프로그래밍/oracle

oracle - 실행계획 해석하기(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 방식으로 실행 계획이 생성 되었습니다.


 

 

 

 


반응형