A-100만건, B-1억건 에서 데이터를 추출할 때...
dsh21 수험생

답변 채택시 : 0코아

답변 2 추천 0 조회 5439 2014.04.11

[A] - 100만건

[B] - 1억건


select a.col1

from A

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


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


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


다만 [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 = B.key



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



댓글 (0)
목록 답변등록
A-100만건, B-1억건 에서 데이터를 추출할 때...
stbo 2014.04.25

밑에 분이 대답을 잘 해주셨습니다만 사족을 붙이자면

 

A테이블의 탐색한 건수 1건에 대해 테이블을 엑세스 하지 않더라도 B테이블의

인덱스를 접근하는 것도 랜덤 엑세스 입니다.

 

랜덤 엑세스는 기본적으로 몇만건 이상이 되면 부하가 되며 이럴때는

Hash Join으로 작은 테이블을 드라이빙 시키는 것이 더 낫다고 보입니다.

 

 

댓글 (1)
A-100만건, B-1억건 에서 데이터를 추출할 때...
jhmyung 2014.04.25

질문자로부터 답변이 채택 되었습니다.

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

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


--> 예 맞습니다. 인덱스 랜덤 액서스가 당연히 있지요.. 랜덤 액세스는 연속한 저장장소를 스캔하지 않고 임의의 저장소의 위치를 찾아 가는 행위를 통틀어 이야기 하는 것입니다. 그렇기 때문에 A 테이블 100만건에 대한 B 테이블의 인덱스를 100 만번 랜덤 액세스하게 됩니다.   당연 비효율이 무지 많겠지요...   적절한 방법은 아닙니다. 


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

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


--> 지금의 상황에서는 가장 좋은 방법입니다. 즉, A 테이블과 B 테이블을 해쉬조인하는 방법이 현재로서는 가장 최선입니다.  하지만, 지금과 같이 B 테이블을 확인하는 용도(즉, B 테이블의 컬럼을 추출하지 않아도 되는 상황)로만 사용하신다면 그룹핑 후 조인하는 것 보다는 서브쿼리를 사용하고 두 테이블간에 해쉬조인( 언밀하게 이야기 하면 해쉬 세미조인입니다.)을 유도하는 것이 가장 바람직해 보입니다. 

해쉬 세미조인에 대해서는 Dator의 다른 글들을 검색해 보시면 많은 자료들이 있습니다. 



댓글 (1)