Database

[Oracle] Minus, Not Exists, ...

Foolishdevil 2010. 10. 25. 18:31

두 A, B 테이블에서 겹치는 값(교집합)을 제거하고 A 테이블에 대한 값을 나타내고 자 할때 사용하는 쿼리를 구현해 보았습니다.
여기서 A, B 테이블의 Column은 서로 다릅니다..

A 테이블에 속성에는 value1(PK), value3, value5
B 테이블에 속성에는 value1(FK), value2, value4, value6 

이와 같은 테이블이 존재할 때 Minus연산과 Not Exists 연산에 대한 쿼리입니다.
아래의 두 경우의 Query는 index를 사용하지 않고, Table Scan을 합니다.


-- minus일때
SELECT a.Value1, a.value2, a.value3 
FROM A_table a
MINUS 
SELECT a.Value1, a.value2, a.value3 
FROM A_table a, B_table b
WHERE a.value1 = b.value1;

-- not exists일때
SELECT  a.Value1, a.value2, a.value3 
FROM A_table a
WHERE NOT EXISTS (SELECT a.Value1, a.value2, a.value3 
FROM A_table a, B_table b
WHERE a.value1 = b.value1);
※ Index를 이용하지 않고 table scan을 하는 경우
ⓐ Not 연산을 사용하는 경우
ⓑ IS NULL, IS NOT NULL 사용
ⓒ 옵티마이저의 취사 선택
ⓓ 외부적인 변형(External Suppressing)
ⓔ 내부적인 변형(Internal Suppressing)

위의 경우를 제외하고 Index를 사용합니다!!

참고 : http://powerhan.tistory.com/32