2014년 6월 28일 토요일

오라클실행계획(explain plan)에서 사용되는 SQL연산자중 MERGE SEMI JOIN에 대해 알아봅니다.오라클힌트를 배우기전에 실행계획에 대해 이해해주세요. 평일/주말/저녁/SQL/ORACLE/기초실무교육추천합니다. 오라클자바커뮤니티 오프라인 교육센터!!

오라클실행계획(explain plan)에서 사용되는 SQL연산자중 MERGE SEMI JOIN에 대해 알아봅니다.오라클힌트를 배우기전에 실행계획에 대해 이해해주세요. 평일/주말/저녁/SQL/ORACLE/기초실무교육추천합니다. 오라클자바커뮤니티 오프라인 교육센터!!

실행계획 SQL연산(MERGE SEMI JOIN)

구로디지털 오라클자바커뮤니티프로그래밍실무교육센터

SEMI JOIN은 첫 번째 매칭되는 value를 찾기만 하면 결과를 돌려주는 join 문입니다.

MERGE SEMI JOIN HASH SEMI JOIN으로 나타나는데 EXISTS와 같은 Query에서 서브 쿼리 조건에 대한 인덱스가 존재하지 않으면 비효율적인 실행 계획이 세워지게 되는데 이러한 경우 세미 조인을 적절히 이용하면 됩니다.

아래 예문을 따라 해 보면서 각각의 경우 실행계획 및 수행 시간을 유심히 보시기 바랍니다. 기본적으로 오라클 11g에서 MERGE 보다는 HASH 조인을 우선적으로 선택 함을 할 수 있습니다.

SQL> select index_name, table_name from user_indexes
  2  where table_name like 'EMPTEST'
  3  /

INDEX_NAME                     TABLE_NAME
------------------------------ ------------------------------
IDX_EMPTEST_ADDR               EMPTEST
IDX_EMPTEST_DEPTNO             EMPTEST



실습을 위해 DEPTNO 컬럼의 인덱스를 숨기자
(오라클 옵티마이저가 사용하지 않도록 )

SQL> alter index IDX_EMPTEST_DEPTNO invisible;
  인덱스가 변경되었습니다.

-- CBO로 동작하는 경우 서브조인에서 exists등이 인덱스가 없는 경우라면 어떻게 동작하는지 보자

SQL> select  count(e.ename)
  2  from emptest e
  3  where exists (select  1
  4                  from depttest d
  5                 where e.deptno = d.deptno);

COUNT(E.ENAME)
--------------
       2500000

   : 00:00:02.34
--------------------------------------------------------------------

|   0 | SELECT STATEMENT
|   1 |  SORT AGGREGATE      
|*  2 |   HASH JOIN RIGHT SEMI|
|   3 |    TABLE ACCESS FULL  | DEPTTEST
|   4 |    TABLE ACCESS FULL  | EMPTEST


-- 기본적으로 전체 테이블 FULL SCAN HASH SEMI 조인으로 수행된다.
-- 이번엔 RULE 힌트를 넣어 RBO로 동작하도록 하고 결과를 보자.

SQL> select  count(e.ename)
  2  from emptest e
  3  where exists (select 1
  4                  from depttest d
  5                 where e.deptno = d.deptno);

COUNT(E.ENAME)
--------------
       2500000

Execution Plan
----------------------------------------------------------
|   0 | SELECT STATEMENT   
|   1 |  SORT AGGREGATE    
|*  2 |   FILTER            
|   3 |    TABLE ACCESS FULL| EMPTEST 
|*  4 |    TABLE ACCESS FULL| DEPTTEST |


이번에는 HASH SEMI JOIN 힌트 구문을 이용해 보자.
당연히 해시 세미조인을 이용할 것이다.

SQL> select  count(e.ename)
  2  from emptest e
  3  where exists (select  1
  4                  from depttest d
  5                 where e.deptno = d.deptno);

COUNT(E.ENAME)
--------------
       2500000

   : 00:00:02.32

Execution Plan
--------------------------------------------------------------------
|   0 | SELECT STATEMENT      |          |     1 |    20 |  4172   (2)|
|   1 |  SORT AGGREGATE       |          |     1 |    20 |            |
|*  2 |   HASH JOIN RIGHT SEMI|          |  2500K|    47M|  4172   (2)|
|   3 |    TABLE ACCESS FULL  | DEPTTEST |     5 |    15 |     3   (0)|
|   4 |    TABLE ACCESS FULL  | EMPTEST  |  2500K|    40M|  4156   (1)|


이번엔 MERGR SEMI JOIN으로 해시 세미 조인 보다는 시간이 좀 더 걸린다.


SQL> select  count(e.ename)
  2  from emptest e
  3  where exists (select 1
  4                  from depttest d
  5                 where e.deptno = d.deptno);

COUNT(E.ENAME)
--------------
       2500000

   : 00:00:03.50

Execution Plan
----------------------------------------------------------
|   0 | SELECT STATEMENT     |          |     1 |    20 |       | 17977  
|   1 |  SORT AGGREGATE      |          |     1 |    20 |       |            |
|   2 |   MERGE JOIN SEMI    |          |  2500K|    47M|       | 17977  
|   3 |    SORT JOIN         |          |  2500K|    40M|   134M| 17973  
|   4 |     TABLE ACCESS FULL| EMPTEST  |  2500K|    40M|       |  4156  
|*  5 |    SORT UNIQUE       |          |     5 |    15 |       |     4  (25)| 0
|   6 |     TABLE ACCESS FULL| DEPTTEST |     5 |    15 |       |     3  
  


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


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

평일야간(19:00~21:50) 개강
(7/01)안드로이드개발자과정
(7/01)닷넷(C#,Network,ADO.NET,ASP.NET)마스터과정
(7/02)Spring3.X, MyBatis, Hibernate실무과정
(7/02)자바웹(JSP,Spring,MyBatis,XPlatform)프로젝트과정
(7/02)JAVA,Network&WEB&Framework(자바기초에서웹스프링까지)
(7/03)웹퍼블리싱 마스터
(7/15)SQL기초에서실무까지
(7/15)MyBatis3.X, Hibernate4.X ORM실무과정
(7/22)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지

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

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

댓글 없음:

댓글 쓰기