본문 바로가기

프로그래밍/oracle

oracle - [Hint]조인순서 변경(ORDERED)

반응형

[Hint]조인순서 변경(ORDERED)


이 힌트는 FROM 뒤에 기술되는 테이블의 순서대로 조인이 일어나도록 해주는 구문이며 대부분 단독으로는 사용되지 않고 USE_NL(중첩 루프 조인을 유도), USE_MERGE(머지 소트 조인을 유도), USE_HASH(HASH 조인을 유도)등과 같이 사용됩니다.


USE_NL/USE_MERGE/USE_HASH등의 인자로 사용되는 테이블은 FROM절에서 두 번째로 나타나는 테이블 이어야 하는데 FROM절에서 처음 나타나는 테이블이 드라이빙 테이블(OUTER/DRIVING TABLE)이 되고 나중에 나타나는 테이블이 PROBED TABLE(INNER TABLE)이 되는 것 기억해 두세요… 물론 이 부분은 다음 강좌에서 설명이 이어지지만 잘 알고 계셔야 합니다. 보통 드라이빙 테이블의 경우 데이터 건수가 적거나 조인 컬럼에 대해 인덱스가 없는 테이블이 주로 사용되죠^^


참고로 중첩 루프 조인(Nested Loop Join)이나 해시조인(Hash Join)의 경우 성능이 FROM절 뒤에 나타나는 테이블의 순서에 영향을 받지만 MERGE 조인은 영향을 받지 않습니다. 왜냐면 머지 조인은 메모리에 올려서 정렬 시킨 후 병합하니까 실행 계획은 다르게 나올지 모르지만 성능에는 관계 없는 것입니다.


[형식]

/*+ ORDERED */



[예]


아래는 Oracle 10g에서 테스트 한 결과 입니다.


analyze table emp compute statistics

analyze table dept compute statistics


select /*+ORDERED USE_NLe) */

       e.ename,

           d.dname

from   dept d, emp e

where  e.deptno = d.deptno        


------------------------------------------------------------

Operation        Object Name        Rows        Bytes        Cost        

---------------------------------------------------------------

SELECT STATEMENT Optimizer Mode=ALL_ROWS                14                   4 

  TABLE ACCESS BY INDEX ROWID        SCOTT.EMP        4          32          1           

    NESTED LOOPS                14          266          4                                  

      TABLE ACCESS FULL        SCOTT.DEPT        4          44          3                    

      INDEX RANGE SCAN        SCOTT.IDX_EMP_DEPTNO        5                   0  



?        FROM절에서 처음 나타나는 테이블이 드라이빙 테이블(DRIVING/OUTER TABLE)이며 비드라이빙 테이블(PROBE/INNER TABLE)이 USE_NL의 인자로 들어갑니다!!


select /*+ORDERED USE_NL(D) */

       e.ename,

           d.dname

from   emp e, dept d

where  e.deptno = d.deptno        


--------------------------------------------------------------

Operation        Object Name        Rows        Bytes        Cost        

--------------------------------------------------------------

SELECT STATEMENT Optimizer Mode=ALL_ROWS                14                   3 

  NESTED LOOPS                14          266          3                                  

    TABLE ACCESS BY INDEX ROWID        SCOTT.EMP        14          112          2           

      INDEX FULL SCAN        SCOTT.IDX_EMP_DEPTNO        13                   1 

    TABLE ACCESS BY INDEX ROWID        SCOTT.DEPT        1          11          1           

      INDEX UNIQUE SCAN        SCOTT.PK_DEPT        1                   0           

                                                    


이번에는 USE_MERGE와 ORDERED가 같이 쓰이는 경우인데 이 경우엔 FROM 절 뒤 테이블의 순서는 실행계획은 다르게 나티날지 모르지만 성능에는 영향을 미치지 않습니다. 왜냐구요? 위 내용을 읽어 보세요!!



select /*+ORDERED USE_MERGE(D) */

       e.ename,

           d.dname

from   emp e, dept d

where  e.deptno = d.deptno        



--------------------------------------------------------------

Operation        Object Name        Rows        Bytes        Cost        

-------------------------------------------------------------

SELECT STATEMENT Optimizer Mode=ALL_ROWS                14                   6 

  MERGE JOIN                14          266          6                                                       

    TABLE ACCESS BY INDEX ROWID        SCOTT.EMP        14          112          2           

      INDEX FULL SCAN        SCOTT.IDX_EMP_DEPTNO        13                   1 

    SORT JOIN                4          44          4                                                       

      TABLE ACCESS FULL        SCOTT.DEPT        4          44          3                                                      



select /*+ ORDERED USE_MERGE(E) */

       e.ename,

           d.dname

from   dept D, emp E

where  e.deptno = d.deptno        



----------------------------------------------------------------

Operation        Object Name        Rows        Bytes        Cost        

--------------------------------------------------------------

SELECT STATEMENT Optimizer Mode=ALL_ROWS                14                   5 

  MERGE JOIN                14          266          5                                                       

    TABLE ACCESS BY INDEX ROWID        SCOTT.DEPT        4          44          2           

      INDEX FULL SCAN        SCOTT.PK_DEPT        4                   1           

    SORT JOIN                14          112          3                                                       

      TABLE ACCESS BY INDEX ROWID        SCOTT.EMP        14          112          2           

        INDEX FULL SCAN        SCOTT.IDX_EMP_DEPTNO        13                   1      

 

 

 


반응형