Oracle

게시글 보기
작성자 유건데이타 등록일 2015-08-10
제목 join에 대해서
PURPOSE
---------
Join의 종류와 이의 사용 방법을 이해한다.

EXPLANATION
-----------
(1) 개요

Join 은 크게
- outer join
- semi join
- anti join 이 있으며, 이에 대해 하나씩 다루어 보기로 한다.


(2)Anti Join

- 1. 전체적 설명

anti-join 은 join 의 반대의 logic 을 갖는다.
이를 실행하면 왼쪽과 오른쪽이 match 되는 row 를 반환해 주는 것이 아니고, 왼쪽이 오른쪽과 match 되지 않는 것을 return 한다.

이 수행은 오른쪽의 subquery 에 NOT IN 이 있는 경우이다.

Anti-join 은 NOT IN 을 수행하기 위해 sort-merge, 또는 hash joins 을
사용한다.
예를 들어 subquery 가 다음의 form 이라고 가정하자.
(colA1, colA2, ... colAn) NOT IN (SELECT colB1, colB2, ..., colBn
FROM ...).

Hash 또는 sort_merge 의 anti join 으로 subquery 가 변환되기 위해 다음의 조건이 뒤따른다 :

1> Table A 의 column reference 는 모두 simple reference 여야 한다.
또 B의 reference 역시 simple 이거나, subquery 가 GROUP BY 를 포함하
는 경우 aggregate functions (MIN, MAX, SUM, COUNT, or AVG)이어야 한
다. 다른 expression 은 허용하지 않는다.

2> All column references must be know to be not null.

3> The subquery must not have any correlation predicates. That is,
predicates referencing anything in surrounding query blocks.

4> The WHERE clause of the surrounding query must not have ORs at
the top-most logical level.

5> Anti-joins 은 cost-based approach를 통해서만 사용 가능하다.


- 2. Anti-Join 사용법

Oracle 은 NOT IN subqueries를 sort-merge 또는 hash anti-joins 으로
변환한다.

만일 조건이 위의 조건과 모두 맞고, hint 또는 init.ora 의 parameter 로
설정되어 있다면 변환은 일어난다.

특정 query 에 대해 MERGE_AJ or HASH_AJ hints 가 NOT IN subquery에
용되어진다. MERGE_AJ 는 sort-merge anti-join, HASH_AJ hash anti-join을
사용한다.

예제 :

SELECT * FROM emp
WHERE ename LIKE 'J%' AND
deptno IS NOT NULL AND
deptno NOT IN (SELECT /*+ HASH_AJ/ deptno FORM dept
WHERE deptno IS NOT NULL AND
loc = 'DALLAS');

만일 anti-join transformation 을 항상 특정 join 을 사용하게 하고 싶으면
init.ora 에 ALWAYS_ANTI_JOIN 을 MERGE 또는 HASH 로 준다.

(2) Semi Join

- 첫번째 match 되는 value 를 찾기만 하면 결과를 display 해주는 join 문이
다. 예를 들어 EXISTS fuction 을 쓰는 경우이다.

(3) Outer Join

outer join 을 이해 하기 위해 outer join 의 기본을 다룬 다른 bulletin 을
이용하여 이해를 한뒤 이 자료를 참고 한다.

- data 가 모자라는 쪽에 (+) 를 붙인다.
_ 이의 plan 순서는 (+)쪽에 index 가 있더라도 ,(+)가 붙지 않는 쪽의
table 이 먼저 풀린다.

- (+) 가 붙은쪽 table 의 모든 column 에 (+)를 붙인다.

- outer join 되는 column 에는 in, between,like, or 를 사용하지 못하며
이를 어길 경우 ora-1719 가 발생된다.


오라클 유지보수 유건데이타
Comment
등록된 코멘트가 없습니다.