2014년 7월 10일 목요일

실행계획 SQL연산(NESTED LOOP)[오라클개발자교육/오라클/ORACLE강좌/오라클교육잘하는곳/오라클교육추천/ORACLE실무교육/ORACLE/ORACLE교육/ORACLE학원/오라클실무교육]

실행계획 SQL연산(NESTED LOOP) 

먼저 아래 SQL문장을 보도록 하죠… 

SQL> SELECT E.ENAME, 
                    D.DNAME 
            FROM  EMP E, DEPT D 
        WHERE  E.DEPTNO = D.DEPTNO 
      
Execution Plan 
------------------------------------------------------ 
SELECT STATEMENT Optimizer=CHOOSE 
TABLE ACCESS (BY INDEX ROWID) OF ‘EMP’ 
NESTED LOOPS 
    TABLE ACCESS (FULL) OF ‘DEPT’ 
    INDEX (RANGE SCAN) OF ‘IDX_EMP_DEPTNO’ (NON UNIQUE) 

이 경우 DEPT 테이블이 드라이빙 테이블이 되고 EMP 테이블은 비드라이빙 테이블이 되는데, 이는 DEPT 테이블을 FULL SCAN 하면서 로우 하나씩 꺼내 EMP 테이블에 DEPTNO가 같은 것이 있는지를 인덱스(IDX_EMP_DEPTNO)를 이용하여 검색 후 ROWID로 실제 Data를 추출한다는 것입니다. 

이상과 같이 조인되는 컬럼 중에 적어도 하나에 인덱스가 존재하는 경우 나타나는 ROW 연산을 NESTED LOOP라고 합니다. 만약 조인되는 컬럼들에 대해 인덱스가 전혀 없으면 오라클의 경우 MERGE JOIN이나 HASH JOIN을 동반하는 실행계획을 세우게 됩니다. 아래의 예를 참고 하세요~ (아래는 인덱스 컬럼에 변형을 가해 인덱스가 사용되지 않습니다.) 

SQL> SELECT    E.ENAME, 
                      D.DNAME 
        FROM  EMP E, DEPT D 
        WHERE  RTRIM(E.DEPTNO) = RTRIM(D.DEPTNO) 

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’ 


이번엔 FROM절 다음의 테이블의 나타나는 순서에 대해 설명 드리면 RULE-BASES Optimizer에서는 FROM절에서 나중에 나타나는 테이블이 드라이빙 테이블이 됩니다. 아래의 /*+ RULE */ 이라는 힌트는 RULE-BASES Optimizer로 동작하라는 의미를 부여하는 것인데 테이블에 대해 통계 정보가 없고 OPTIMIZER_MODE 파라미터를 CHOOSE라고 Setting 했다면 저절로 RULE-BASED Optimizer로 동작하게 됩니다. 

[테이블에 대해 통계 정보가 생성되지 않은 경우라고 가정, EMP 테이블의 DEPTNO, DEPT 테이블의 DEPTNO 컬럼에 인덱스가 있다고 가정] 

SQL> SELECT /*+ RULE */ E.ENAME, 
                    D.DNAME 
            FROM  EMP E, DEPT D 
        WHERE  E.DEPTNO = D.DEPTNO 
      
Execution Plan 
------------------------------------------------------ 
SELECT STATEMENT Optimizer=Hint:RULE 
TABLE ACCESS (BY INDEX ROWID) OF ‘EMP’ 
NESTED LOOPS 
    TABLE ACCESS (FULL) OF ‘DEPT’ 
    INDEX (RANGE SCAN) OF ‘IDX_EMP_DEPTNO’ (NON UNIQUE) 

위에서 FROM절에서 나중에 나타나는 DEPT 테이블이 드라이빙 테이블이 되는 것입니다. 주의할 점은 RULE-BASED Optimizer이지만 조인 컬럼중 한쪽만 인덱스가 존재 한다면 FROM절에 나타나는 테이블의 순서와 상관없이 INDEX가 없는 테이블이 드라이빙 테이블이 됩니다. 그래서 이 경우 테이블의 건수가 많은 테이블이 드라이빙 테이블로 잘못 선정되면 성능에 악영향을 줄 수 있습니다. 

감사합니다. 


오라클자바커뮤니티교육센터, 개발자전문교육, 개인80%환급 
www.oraclejavacommunity.com


평일주간(9:30~18:10) 개강
(7/14)[기업100%환급]C#4.0,WinForm,ADO.NET프로그래밍
(7/14)[기업100%환급]SQL기초에서 Schema Object까지
(7/14)[기업100%환급]안드로이드개발자과정
(7/21)[기업100%환급]자바기초에서 JDBC, Servlet/JSP까지 
(7/21)[기업100%환급]Spring ,MyBatis,Hibernate실무과정
(7/21)[기업100%환급]PL/SQL,ORACLE HINT,TUNING
(7/21)[채용예정교육]오라클자바개발잘하는신입뽑기프로젝트,교육전취업확정

평일야간(19:00~21:50) 개강
(7/09)닷넷(C#,Network,ADO.NET,ASP.NET)마스터과정
(7/15)SQL기초에서실무까지
(7/15)안드로이드개발자과정
(7/16)Spring3.X, MyBatis, Hibernate실무과정
(7/21)웹퍼블리싱 마스터
(7/22)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
(8/05)MyBatis3.X, Hibernate4.X ORM실무과정

주말(10:00~17:50) 개강
(7/12)SQL초보에서 Schema Object까지
(7/12)개발자를위한PLSQL,SQL튜닝,힌트
(7/13)C#,ASP.NET마스터
(7/19)JAVA,Network&WEB&Framework(자바기초에서웹스프링까지)
(7/19)Spring3.X, MyBatis, Hibernate실무과정
(7/19)웹퍼블리싱 마스터
(7/19)안드로이드개발자과정
(8/02)MyBatis3.X, Hibernate4.X ORM실무과정
(8/09)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지

주말저녁(18:30~22:20) 개강
(8/02)JAVA,Network&WEB&Framework
(8/09)SQL기초에서실무까지

댓글 없음:

댓글 쓰기