A(100만건), B(1억건) join 질문입니다 0 2 3,054

by 날도 [2014.04.13 18:34:35]


[A] - 100만건

[B] - 1억건

요구사항 : [B]테이블에 존재하는 [A] 의 'col1' 을 구하는 쿼리입니다....

select a.col1

from A

exists ( select 'x' from B where B.key = A.key)

인덱스가 완벽히 구성되어있어, 테이블 랜덤액세스는 전혀 발생이 되지 않습니다....

다만 [A] 의 100만건을  B테이블의 인덱스로 100만번 찾아 들어간다는 비효율(?) 이 발생할것 같습니다....

질문1>이것이 과연 비효율인가요???

(인덱스만 이용했으니 테이블 랜덤 액세스 전혀 없이....인덱스 랜덤 액세스(??) 너무 많이 일어난다?????이런게 존재하는지 모르겠지만 ...)

질문2>비효율이라면....

이럴 경우 1억건의 데이터를 먼저 멀티 블락으로 INDEX FAST FULL SCAN 하고 key로 그룹바이 한다음 조인을 hash 조인을 하는게 제일 좋은 방법인까요?

select /*+ index_ffs(~~) use_hash(작은테이블)*/  A.col1

from A,

(

select /*+no_unnest index_ffs(~~) */ B.key from B

group by b.key

) BB

where A.key = BB.key



질문3> 다른 좋은 방법이 있는지.....

by 비주류 [2014.04.16 01:35:44]
케이스 별로 테스트 해보셔도 좋겠지만,

index 만으로 semi join(nl) 이라면 1번이 더 나을 것 같습니다. 

join 대상을 줄여준다는 의미는 있겠지만 group by, hash join 로 인한 추가적인 리소스를 고려하면 2번이 모든 경우에 최적이라 보기는 어려울 것 같습니다. 메모리 안에서 해결이 안되면 더 심각하구요.

데이터 분포를 확인할 길이 없어서... 이래서 상황별로 튜닝 업무가 꼭 필요한 것이 아닐까요? ^^;;

아래쪽 힌트는 의도하신 바라면 use_hash(probe table), BB 안쪽은 no_merge일 것 같습니다.

고수님들의 의견을 함께 기다려 보겠습니다. ^^

by 날도 [2014.04.16 09:39:35]
답변 감사합니다.
일반적(데이터분포 일정)적인 상황에서 어떤게 더 효율적인지 궁금하네요....
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입