메뉴 건너뛰기

bysql.net

11. 집합 연산을 조인으로 변환

2011.06.08 04:16

오라클잭 조회 수:4954

 

-Intersect 나  Minus 같은 집합 연산을 조인 형태로 변환하는 것을 말함

 

_________________________________________________________________________________________________________________

TEST

 

-deptno=10에  속한 사원들의 job,mgr을 제외시키고 나머지 job,mgr 집합만을 찾는 쿼리

SQL> set autotrace traceonly exp;
SQL> select job, mgr from emp
  2  minus
  3  select job, mgr from emp
  4  where  deptno = 10 ;

Execution Plan
----------------------------------------------------------

-----------------------------------------------------------------
| Id  | Operation           | Name | Rows  | Bytes | Cost (%CPU)|
-----------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |    15 |   225 |     8  (63)|
|   1 |  MINUS              |      |       |       |            |
|   2 |   SORT UNIQUE       |      |    15 |   180 |     4  (25)|
|   3 |    TABLE ACCESS FULL| EMP  |    15 |   180 |     3   (0)|
|   4 |   SORT UNIQUE       |      |     3 |    45 |     4  (25)|
|*  5 |    TABLE ACCESS FULL| EMP  |     3 |    45 |     3   (0)|
-----------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   5 - filter("DEPTNO"=10)

*각각 sort unique 연산을 수행한 후에 Minus연산을 수행

 

 

-_convert_set_to_join 파라미터를 true로 설정

SQL> alter session set "_convert_set_to_join" = true;

세션이 변경되었습니다.

SQL> select job, mgr from emp
  2  minus
  3  select job, mgr from emp
  4  where  deptno = 10 ;

Execution Plan
----------------------------------------------------------

-----------------------------------------------------------------
| Id  | Operation           | Name | Rows  | Bytes | Cost (%CPU)|
-----------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |    11 |   297 |     8  (25)|
|   1 |  HASH UNIQUE        |      |    11 |   297 |     8  (25)|
|*  2 |   HASH JOIN ANTI    |      |    11 |   297 |     7  (15)|
|   3 |    TABLE ACCESS FULL| EMP  |    15 |   180 |     3   (0)|
|*  4 |    TABLE ACCESS FULL| EMP  |     3 |    45 |     3   (0)|
-----------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access(SYS_OP_MAP_NONNULL("JOB")=SYS_OP_MAP_NONNULL("JOB") AND
              SYS_OP_MAP_NONNULL("MGR")=SYS_OP_MAP_NONNULL("MGR"))
   4 - filter("DEPTNO"=10)

*해시 anti 조인을 수행하고 나서 중복 값을 제거하기 위한 hash unique 연산을 수행

 

-다음과 같은 쿼리 변환이 일어남

SQL> select distinct job, mgr from emp e
  2  where  not exists (
  3    select 'x' from emp
  4    where  deptno = 10
  5    and    sys_op_map_nonnull(job) = sys_op_map_nonnull(e.job)
  6    and    sys_op_map_nonnull(mgr) = sys_op_map_nonnull(e.mgr)
  7  ) ;

Execution Plan
----------------------------------------------------------

-----------------------------------------------------------------
| Id  | Operation           | Name | Rows  | Bytes | Cost (%CPU)|
-----------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |    11 |   297 |     8  (25)|
|   1 |  HASH UNIQUE        |      |    11 |   297 |     8  (25)|
|*  2 |   HASH JOIN ANTI    |      |    11 |   297 |     7  (15)|
|   3 |    TABLE ACCESS FULL| EMP  |    15 |   180 |     3   (0)|
|*  4 |    TABLE ACCESS FULL| EMP  |     3 |    45 |     3   (0)|
-----------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access(SYS_OP_MAP_NONNULL("JOB")=SYS_OP_MAP_NONNULL("E"."JOB")
              AND SYS_OP_MAP_NONNULL("MGR")=SYS_OP_MAP_NONNULL("E"."MGR"))
   4 - filter("DEPTNO"=10)

*sys_op_map_nonnull

  null 값끼리 비교(null=null)하면 false이지만 가끔  true가 되도록 처리해야 하는 경우가 있고 그럴 때 위 함수를 사용

  위에서는 job과 mgr이 null 허용 컬럼이기 때문에 위와 같은 처리가 일어난다

 

번호 제목 글쓴이 날짜 조회 수
35 1. 옵티마이저 file 휘휘 2011.04.18 6057
34 3. 옵티마이저의 한계 - P 휘휘 2011.04.18 3695
33 2. 옵티마이저 행동에 영향을 미치는 요소 balto 2011.04.18 6158
32 3. 옵티마이저의 한계 휘휘 2011.04.19 6698
31 4. 통계정보 Ⅰ file 토시리 2011.04.25 16002
30 6. 히스토그램 오예스 2011.04.25 17363
29 5. 카디널리티 오라클잭 2011.04.27 12913
28 7. 비용 file balto 2011.05.02 4989
27 8. 통계정보 Ⅱ AskZZang 2011.05.04 5913
26 1. 쿼리 변환이란? 운영자 2011.05.16 6254
25 3. 뷰 Merging 오라클잭 2011.05.17 6080
24 2. 서브쿼리 Unnesting 토시리 2011.05.18 2074
23 5. 조건절 이행 file balto 2011.05.30 5460
22 4. 조건절 Pushing 오예스 2011.05.31 17467
21 6. 조인 제거 AskZZang 2011.06.01 5440
20 7. OR-Expansion AskZZang 2011.06.01 8320
19 12. 기타 쿼리 변환 휘휘 2011.06.06 3118
18 10. 실체화 뷰 쿼리로 재작성 오라클잭 2011.06.08 9949
» 11. 집합 연산을 조인으로 변환 오라클잭 2011.06.08 4954
16 2. 소트를 발생시키는 오퍼레이션 file balto 2011.06.12 4846