메뉴 건너뛰기

bysql.net

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

2011.06.08 04:16

오라클잭 조회 수:4955

 

-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 7. 인덱스 스캔 효율 file 휘휘 2011.03.06 8449
34 7. OR-Expansion AskZZang 2011.06.01 8327
33 1. 소트 수행 원리 file balto 2011.06.12 8013
32 2. 소트 머지 조인 오예스 2011.03.21 7912
31 4. 테이블 Random 액세스 부하 file 휘휘 2011.02.26 6942
30 1장. 인덱스 원리와 활용 휘휘 2011.02.21 6796
29 3. 옵티마이저의 한계 휘휘 2011.04.19 6698
28 3. 해시 조인 휘휘 2011.03.21 6487
27 8. 고급 조인 테크닉-1 file 휘휘 2011.04.05 6460
26 1. 쿼리 변환이란? 운영자 2011.05.16 6258
25 2. 옵티마이저 행동에 영향을 미치는 요소 balto 2011.04.18 6160
24 3. 뷰 Merging 오라클잭 2011.05.17 6082
23 1. 옵티마이저 file 휘휘 2011.04.18 6064
22 7. Sort Area 크기 조정 오예스 2011.06.16 5973
21 8. 통계정보 Ⅱ AskZZang 2011.05.04 5913
20 8. 인덱스 설계 AskZZang 2011.03.09 5726
19 5. 조건절 이행 file balto 2011.05.30 5465
18 6. 조인 제거 AskZZang 2011.06.01 5441
17 4. 조인 순서의 중요성 AskZZang 2011.03.30 5328
16 9. 비트맵 인덱스 휘휘 2011.03.07 5014