마농님 조인관련 질문 있습니다. 0 3 1,764

by michael [2013.12.30 12:37:04]


저번주에 질문드린 내용입니다.
해결은 했지만 항상 이런 부분에서 궁금증이 있어서 질문 드립니다.

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으로 처리했으나 속도가 잘 나오지 않고 있습니다.

좋은 조언 부탁드탁드립니다.
by 마농 [2013.12.30 13:27:37]

해당 SQL의 실행계획은 확인해 보셨나요?
예상 결과대로 동작하지 않는다면?
인라인뷰 안에 no_merge 힌트를 써보세요.
예상 결과대로 동작했는데 느리다면?
다른 계획을 찾으셔야 할 듯.


저는 힌트를 선호하지 않는 편이라서요...
일단 힌트 다 빼고 그냥 3개 테이블 조인 시도는 해보셨나요?
한번 해보시고 실행계획 확인해 보세요.


by 손님 [2013.12.30 13:55:50]
답변 진심으로 감사드립니다.

by michael [2013.12.30 13:57:07]
답변 진심으로 감사드립니다. ^^
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입