티스토리 뷰

반응형
하나의 테이블에서 데이터를 추출할때 다른 테이블에 없는 데이터만 추출하고자 할때
사용하는 것이  ANTI JOIN 입니다.
다른 집합에 있는 것만 뽑는 것은 EXIST나 IN 으로 연결하여 뽑으면 대부분 좋은 성능의
결과를 얻을 수 있지만 NOT EXISTS나 NOT IN은 좋은 성능을 위해서 고려해야 할 점이
많죠. NOT IN 이 사용되야 할때 MERGE ANTI JOIN이나 HASH ANTI JOIN를 사용하면
성능 향상에 많은 도움이 됩니다.
실제로 오늘 처음으로 MERGE ANTI JOIN를 사용해 봤는데 기적 그 자체더군요.
굳~~

SELECT COUNT(*)
FROM TAB1
WHERE COL1 LIKE 'ABC%'
AND COL2 IS NOT NULL
AND COL2 NOT IN ( SELECT /*+ MERGE_AJ */
                                          FLD2
                              FROM TAB2
                              WHERE FLD3 LIKE '1999%'
                        AND FLD2 IS NOT NULL );

 ps. COL2 IS NOT NULL 처럼 연결고리 컬럼의 값이 not null 임을 명시
    해야 anti join 실행계획이 만들어 지는데요. 오라클 11g 부터는 명시
    하지 않아도 된다고 합니다.

 MERGE ANTI 조인은 SORT MERGE조인시 부정형에서 사용된다.

1. 반드시 조인되는 컬럼이 IS NOT NULL로 의미없는 선언을 해주어야 한다. (8I 이전, 이후 확인 필요)

2. MERGE_AJ HINT 참조

3. HASH_AJ HINT도 동일(HASH SORT MERGE JOIN)




ps. NOT IN외에 A집합을 추출하는데 B집합에 없는거 추출하는 솔루션
1. NOS EXISTS //평범함으로 설명 생략
2. MINUS          // MINUS는 SORT와 중복제거가 되므로 대용량에선 부적합을 수 있음
3. Outer + Null Check .. 패턴
   select a.*
   from a, b
   where a.key = b.key(+) and b.key is null;
   NOT IN이나 NOT EXISTS는 주로 Nested Loop Join이나 Nested Loop Anti Join
   방법을 수행하는데 위의 방법은 Hash Join이나 Merge Join를 유도해 성능을 보장
   받을 수 있다고 함
반응형