2014년 4월 4일 금요일

[실무오라클ACCESS경로변경힌트]NATIVE_FULL_OUTER_JOIN,외부조인(outer join)중 FULL OUTER JOIN을 지원하기 위한 힌트, [자바개발자교육/자바교육/자바강좌/자바교육잘하는곳/자바교육추천/자바실무교육/JAVA/JAVA교육/JAVA학원/JAVA실무교육]

[실무오라클ACCESS경로변경힌트]NATIVE_FULL_OUTER_JOIN,외부조인(outer join)중 FULL OUTER JOIN을 지원하기 위한 힌트, [자바개발자교육/자바교육/자바강좌/자바교육잘하는곳/자바교육추천/자바실무교육/JAVA/JAVA교육/JAVA학원/JAVA실무교육]

외부조인(outer join)중 FULL OUTER JOIN을 지원하기 위한 힌트로 Oracle 10g R2에서는 Full Outer Join을 실행하면 Union All로 분리되어 Outer Join과 Anti-Join이 실행된다. _optimizer_nativer_full_outer_join이 off로 되어 있어서 그렇다. 하지만 오라클11g에서는 default로 Force값으로 되어 있기에 Union All 과 Anti Join이 없어졌다.



형식 : /*+ NATIVE_FULL_OUTER_JOIN  */


[실습]

실습데이터는 http://www.oraclejavanew.kr/bbs/board.php?bo_table=LecHINT&wr_id=117 참조하여 만들자.

SQ> conn / as  sysdba
SQL> alter session set "_optimizer_native_full_outer_join" = force;

세션이 변경되었습니다.

SQL> show parameter "_optimizer_native_full_outer_join"

NAME                                TYPE        VALUE
------------------------------------ ----------- ------------------------------
_optimizer_native_full_outer_join    string      FORCE


SQL> conn scott/tiger
연결되었습니다.
SQL> -- full out join 실습을 위해 부서코드가 없는 사원, 사원을 안가지고 있는 부서데이터를 입력
SQL> -- 부서테이블에서 부서는 0부터 4사이 숫자, 사번은 1~2천만번사이값이 현재 있다.

SQL> insert into myemp1(empno, ename, deptno) values (20000002, 'TEST',5);

1 개의 행이 만들어졌습니다.

SQL> insert into mydept1 (deptno, dname) values (6, '부서6');

1 개의 행이 만들어졌습니다.

NATIVE_FULL_OUTER_JOIN 힌트를 주지 않아도 "_optimizer_native_full_outer_join” 파라미터 기본값이 Force이므로 잘 실행된다.

SQL> select count(e.empno)
  2    from myemp1 e full outer join mydept1 d
  3  on (e.deptno = d.deptno);

경  과: 00:00:23.39

Execution Plan

|  0 | SELECT STATEMENT      |          |    1 |    13 | 40110  (1)|
|  1 |  SORT AGGREGATE        |          |    1 |    13 |            |
|  2 |  VIEW                | VW_FOJ_0 |    20M|  247M| 40110  (1)|
|*  3 |    HASH JOIN FULL OUTER|          |    20M|  228M| 40110  (1)|
|  4 |    TABLE ACCESS FULL  | MYDEPT1  |    5 |    15 |    3  (0)|
|  5 |    TABLE ACCESS FULL  | MYEMP1  |    20M|  171M| 40008  (1)|


이번에는 alter session set "_optimizer_native_full_outer_join" = false; 로 변경해 놓고 쿼리문을 다시 실행해보자.

SQL> alter session set "_optimizer_native_full_outer_join" = off;

세션이 변경되었습니다.

SQL> select count(e.empno)
  2    from myemp1 e full outer join mydept1 d
  3  on (e.deptno = d.deptno);

경  과: 00:00:46.61

| Id  | Operation                | Name    | Rows  | Bytes | Cost (%CPU)| Time
  |

--------------------------------------------------------------------
|  0 | SELECT STATEMENT        |        |    1 |    13 | 80221  (1)|
|  1 |  SORT AGGREGATE          |        |    1 |    13 |            |
|  2 |  VIEW                  |        |    20M|  247M| 80221  (1)| 00:16:
|  3 |    UNION-ALL            |        |      |      |            |
|*  4 |    HASH JOIN RIGHT OUTER|        |    20M|  228M| 40110  (1)|
|  5 |      TABLE ACCESS FULL  | MYDEPT1 |    5 |    15 |    3  (0)|
|  6 |      TABLE ACCESS FULL  | MYEMP1  |    20M|  171M| 40008  (1)|
|*  7 |    HASH JOIN ANTI      |        |    1 |    6 | 40110  (1)| 00:08:
|  8 |      TABLE ACCESS FULL  | MYDEPT1 |    5 |    15 |    3  (0)|
|  9 |      TABLE ACCESS FULL  | MYEMP1  |    20M|    57M| 40008  (1)|


같은 테이블을 두번 씩 질의 하면서 UNION_ALL로 풀었다.

댓글 없음:

댓글 쓰기