INNER JOIN, CROSS JOIN, OUTER JOIN NATURAL JOIN은 다들 익히 들었을 것이다. 오늘 다룰 JOIN은 여기서 한 단계 더 들어간 NESTED LOOP JOIN, SORT MERGE JOIN, HASH JOIN이다. 같은 JOIN들이지만 어떤식으로 내부적으로 수행되는 방식은 제각기 다를 수 있다. 오늘은 위의 JOIN들이 무엇인지 그리고 어떤식으로 수행되는지에 대해 다뤄보고자 한다.
NESTED LOOP JOIN 중첩 FOR루프와 비슷하다고 생각하면 된다.
두 테이블을 조인하려고 한다. NESTED LOOP JOIN에서는 다음과 같은 방식으로 실행된다.
- OUTER TABLE에서 조건 ROW를 골라 맞는 데이터를 INNER TABLE에서 찾는다.
- 첫번째 ROW 조건을 다 찾은 다음에는 다른 두번째 ROW와 조건이 맞는 것을 확인한다.
- 그리고 두번째 ROW와 조건이 맞는 데이터를 다 찾아냈다면 다음 조건으로 넘어간다.
이것을 NESTED LOOP JOIN이라고 한다. 만약 NESTED LOOP JOIN을 실행하는데 INNER TABLE에 INDEX가 없다면 굉장한 비효율이 발생하다. 매 건을 수행할 때마다 FULL SACN을 실행하기 때문이다. 때문에 INNER TABLE의 인덱스 구성 전략이 매우 중요하다.
NESTED LOOP JOIN과 비슷하게 중첩 FOR문과 유사하지만 먼저 JOIN 컬럼을 기준으로 SORTING을 진행한 뒤에 JOIN을 진행한다는 차이가 있다.
OUTER TABLE을 BLILD INPUT으로 삼아서 HASH영역에 저장하는 JOIN 방법이다. HASH영역은 SORT MERGE JOIN에서 SORTING하는 PGA영역에 있기 때문에 처리 속도가 빠르다. HASH영역으로 올라갈 때는 JOIN컬럼을 기준으로 HASH FUNCTION이 적용되기 때문에 KEY컬럼에 중복값이 없을수록 성능에 유리하다.