2013년 11월 14일 목요일

조인 방법 변경(LEADING), 오라클 힌트 강좌 (ORACLE교육학원,오라클학원강좌)

조인 방법 변경(LEADING), 오라클 힌트 강좌 (ORACLE교육학원,오라클학원강좌)

[Hint]조인 방법 변경(LEADING):

구로디지털 오엔제이프로그래밍실무교육센터

오라클 힌트 구문 중 하나인 LEADING 힌트는 두 테이블 조인 시 드라이빙 테이블을 인자로 사용하며,  ORDERED와 같이 FROM절 뒤에 오는 테이블의 위치가 중요 합니다.

참고로 ORDERED 힌트는 주로 USE_NL/USE_MERGE/USE_HASH 힌트와 같이 사용되는데 USE_NL/USE_MERGE/USE_HASH 인자로 사용되는 테이블은 FROM절에서 두 번째로 나타나는 테이블 이어야 하며 FROM절에서 처음 나타나는 테이블이 드라이빙 테이블(OUTER/DRIVING TABLE)이 되고 나중에 나타나는 테이블이 PROBED TABLE(INNER TABLE)이 됩니다.

[9i]
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 DEPT
  NESTED :namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /><st1:place w:st="on">LOOP</st1:place>
    TABLE ACCESS (FULL) OF EMP
    INDEX (RANGE SCAN) OF idx_dept_deptno


위 힌트는 ORDERED를 이용하면 다음과 같이 바꿀 수 있습니다.

SELECT E.ENAME, D.DNAME
     FROM EMP E, DEPT D
     WHERE E.DEPTNO = D.DEPTNO;



[실습]

-      실습을 위한 예제 테이블 및 데이터는 아래 링크에서 확인 바랍니다.

myemp1 : 1000만건
myemp1_old : 100만건
mydept : 5

테스트환경 : oracle 11g



n  Mydept1이 드라이빙 테이블, myemp1이 내부 테이블(비 드라이빙 테이블)
SQL> select
  2         e.ename,
  3         d.dname
  4  from   mydept1 d, myemp1 e
  5  where  e.deptno = d.deptno ;

20000000 개의 행이 선택되었습니다.

   : 00:02:11.23
------------------------------------------------------------------------------
| Id  | Operation          | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |         |    20M|   476M|   169K  (1)| 00:33:53 |
|   1 |  NESTED LOOPS      |         |    20M|   476M|   169K  (1)| 00:33:53 |
|   2 |   TABLE ACCESS FULL| MYDEPT1 |    10 |   100 |     3   (0)| 00:00:01 |
|*  3 |   TABLE ACCESS FULL| MYEMP1  |  2000K|    28M| 16939   (1)| 00:03:24 |
------------------------------------------------------------------------------



이번에는 mydept1이 드라이빙, myemp1이 비드라이빙

SQL> select
  2         e.ename,
  3         d.dname
  4  from   mydept1 d, myemp1 e
  5  where  e.deptno = d.deptno ;

20000000 개의 행이 선택되었습니다.

   : 00:01:47.94

------------------------------------------------------------------------------
| Id  | Operation          | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |         |    20M|   476M| 17043   (2)| 00:03:25 |
|*  1 |  HASH JOIN         |         |    20M|   476M| 17043   (2)| 00:03:25 |
|   2 |   TABLE ACCESS FULL| MYDEPT1 |    10 |   100 |     3   (0)| 00:00:01 |
|   3 |   TABLE ACCESS FULL| MYEMP1  |    10M|   143M| 16941   (1)| 00:03:24 |
------------------------------------------------------------------------------

댓글 없음:

댓글 쓰기