저번주에 질문드린 내용입니다.
해결은 했지만 항상 이런 부분에서 궁금증이 있어서 질문 드립니다.
tab1 테이블 : 건수 100만건 전체스캔해야 함.
index : key1 + key2(pk)
tab2 테이블 : 건수 2억건
index : key1 + key2
(key1, key2는 tab1과 tab2 동일 컬럼)
tab3테이블 : 건수 3억 건
index : key1 + key3
조인순서 : tab1 --> tab2 --> tab3순으로
tab1과 tab2 조인 후 tab2의 key1과 key3조회 한 후 tab3와 key1과 key3조인
tab1과 tab2는 1:1 매칭
(tab1 :100건 -->조인 --> tab2 : 100만건--> 조인 --> tab3 : 400만 건)
최종 결과는 300건 (key3별 count)
제가 작성한 sql
select /*+ ordered use_hash(t2) */
t2.key,
count(*) cnt
from (select /*+ ordered use_hash(b) */
b.key1, b.key3
from tab1 a, tab2 b
where a.key1 = b.key1
and a.key2 = b.key2) t1
tab3 t2
where t1.key1 = t2.key1
and t1.key3 = t2.key3
group by t2.key3
having count(*) > 1;
해쉬조인 조건
1. 한 쪽 테이블이 Hash Area에 담길 정도로 충분히 작아야 한다.
1. Build Input 해시 키 컬럼에 중복 값이 거의 없어야 한다.
라고 알고 있습니다.
해당 쿼리의 경우 t1과 t2조인 결과는 key1와 key3에는 중복값이 거의 존재 하지 않습니다.
그래서 인라인 뷰를 최종 build input으로 잡았고 t3에는 key1과 key3에 중복값이 존재하여
probe input으로 처리했으나 속도가 잘 나오지 않고 있습니다.
좋은 조언 부탁드탁드립니다.