용량이 적다면 큰 차이가 없는데, 반대로 액세스 데이타가 많을 때
NL-JOIN은
선결 처리가 랜덤이고 최악의 경우 아직 메모리에 없고 디스크에 있으면...
선행 처리 루프가 랜덤 탈 때마다 한 개 블록에 데이타가 있다는 보장도 없고...
메모리에 가지고 와도 데이타가 많아 지정한 정렬 영역보다 커서
여기서 발생하는 부하는 급 상승 할 수 있고..
(이럴 경우 클래스터 팩터와 정렬 메모리 크기를 조정하면 되는데... 초대형은.. 이런 부분도 의미가 희석..)
해쉬는 이런 문제에 대해 보다 유연한 처리를 가지는 것 같습니다.
페어, 해쉬키를 써서 랜덤 인덱스 부하가 없고 대량을 처리해도 파티션 단위로 처리해서
대용량 처리 시 앞서 NL 정렬을 위한 크기보다 해쉬 영역 크기 지정 부담이(파티션) 적습니다.
최근 DBMS 옵티마이저는 해쉬로 처리하려는 경향이 보다 강해지고 있다고 합니다.
이 말만 보면 왜 NL-JOIN를 쓰지? 다 HASH 쓰지.. 하는데
다 HASH로 하면 관련 처리를 위해 메모리를 잡아먹기 때문에 이것저것 다 메모리를 쓰다 보면
시스템 전체에 부하를 줄 수가 있기 때문에 NL-JOIN로 충분히, 훌륭히 처리 할 수 있는 것들이 아니라면 검토해야 할 조인 방법이 아닌가 합니다.
아 또한 인덱스는 영구적인? 반면 해쉬 조인은 요청 할 때마다 해슁 처리를 하기 때문에
대용량이 아닌 빈번한 OLTP 같은 처리에서 효율이 떨어질 수 있습니다.
이론적으로는 내용을 좀 더 추가하면 위와 중복되지만..
해쉬는 랜덤 액세스 및 정렬 부하가 없기 때문에 대량 범위나 클러스터 팩터가 나쁠 때 유리하다고 합니다. 반대인 경우라면 그럼 NL-JOIN이 적절한 조인이 되겠네요.