메뉴 건너뛰기

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 6. 조인 제거 AskZZang 2011.06.01 5441
34 4. 조건절 Pushing 오예스 2011.05.31 17482
33 5. 조건절 이행 file balto 2011.05.30 5465
32 2. 서브쿼리 Unnesting 토시리 2011.05.18 2079
31 3. 뷰 Merging 오라클잭 2011.05.17 6082
30 1. 쿼리 변환이란? 운영자 2011.05.16 6258
29 8. 통계정보 Ⅱ AskZZang 2011.05.04 5913
28 7. 비용 file balto 2011.05.02 4997
27 5. 카디널리티 오라클잭 2011.04.27 12919
26 6. 히스토그램 오예스 2011.04.25 17389
25 4. 통계정보 Ⅰ file 토시리 2011.04.25 16013
24 3. 옵티마이저의 한계 휘휘 2011.04.19 6698
23 2. 옵티마이저 행동에 영향을 미치는 요소 balto 2011.04.18 6160
22 3. 옵티마이저의 한계 - P 휘휘 2011.04.18 3699
21 1. 옵티마이저 file 휘휘 2011.04.18 6064
20 8. 고급 조인 테크닉-1 file 휘휘 2011.04.05 6460
19 8. 고급 조인 테크닉-2 오라클잭 2011.04.05 12560
18 7. 조인을 내포한 DML 튜닝 오예스 2011.04.04 9946
17 4. 조인 순서의 중요성 AskZZang 2011.03.30 5328
16 1. 인덱스 구조 file 운영자 2011.03.30 15951