2014년 9월 30일 화요일

[Hint]조인순서 변경(ORDERED)[오라클개발자교육/오라클/ORACLE강좌/오라클교육잘하는곳/오라클교육추천/ORACLE실무교육/ORACLE/ORACLE교육/ORACLE학원/오라클실무교육]

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                



 기업100%환급/오라클/자바/스프링/안드로이드/닷넷C#/웹퍼블리싱… 오라클자바…12-272033
 [채용예정교육]오라클자바개발잘하는신입뽑기2개월과정,교육전취…오라클자바…12-111482
53 [평일주간]100%환급6건,안드로이드,자바,C#,스프링3.2,SQL,힌트/… 오라클자바…03-151244
52 [기업100%환급]C#4.0,WinForm,ADO.NET프로그래밍 오라클자바…01-311399
51 [평일,기업100%환급]SQL기초에서 Schema Object까지 오라클자바…01-311260
50 [평일야간]HTML5, CSS3,Ajax, jQuery마스터과정 오라클자바…01-311086
49 [평일주간,평일야간,주말]Spring,MyBatis,Hibernate개발자과정 오라클자바…01-191402
48 [평일주간,평일야간,주말]안드로이드개발자과정 오라클자바…01-111231
47 [평일야간,주말주간,주말야간]JAVA,Network&JSP&Spring,MyBatis,… 오라클자바…01-031731
46 기업100%환급/오라클/자바/스프링/안드로이드/닷넷C#/웹퍼블리싱… 오라클자바…12-272033
45 [기업100%환급,평일주간]자바기초에서 JDBC, Servlet/JSP까지 오라클자바…12-191496
44 [평일야간, 주말]웹퍼블리싱 마스터(HTML5,CSS3,jQUERY,AJAX,Jav… 오라클자바…12-141477
43 [채용예정교육]오라클자바개발잘하는신입뽑기2개월과정,교육전취… 오라클자바…12-111482
42 [평일,기업100%환급]자바기초에서 JDBC, Servlet/JSP까지 오라클자바…12-091185
41 [평일야간, 주말]닷넷(C#,Network,ADO.NET,ASP.NET)마스터 오라클자바…12-011402
40 [기업100%환급]C#4.0,WinForm,ADO.NET프로그래밍(평일주간(단기)… 오라클자바…12-011547
39 [평일야간,주말]SQL기초에서실무까지(SQL기초,PLSQL,힌트,튜닝) 오라클자바…12-011055

댓글 없음:

댓글 쓰기