조인 수행 원리
조인 수행 원리
두개 이상의 테이블을 조인하더라도 반드시 두개의 테이블씩 조인을 수행한다.
예를 들어 A+B+C를 조인할 경우 A+B를 조인한 결과를 가지고 다시 C와 조인한다.
조인에서 테이블의 데이터들을 읽어와야하는데 데이터 블록을 읽을 때 조인문의 앞에서 등장한 테이블 부터 읽게 되어있다. 먼저 읽는 테이블을 선행테이블 이라 하고, 나중에 읽는 테이블은 후행 테이블이라 한다.
h4. 조인의 종류
NL(Nested Loops) Join
- 단순 반복 방식
- for문을 중첩하여 Join을 수행한다.
- 선행 테이블의 조건을 만족하는 행 수가 많으면 후행 테이블의 데이터를 반복해서 읽게 된다.
- 선행 테이블의 데이터는 행의 수가 적을때 전체 일 량을 줄일 수 있다.
- 일량을 계산할 때 5100 = 500 이고 1005=500 이라서 차이가 나지 않을 것 같지만 선행테이블의 경우 조인에 참여하는 데이터들을 모두 메모리로 읽는 반면, 후행테이블의 데이터는 선행테이블과의 데이터를 비교하여 조건에 만족하는 데이터들만 읽기 때문에 전체 일 량을 줄일 수 있는 것이다.
- 결과 데이터는 추출버퍼에 저장되며, 다음 Join 작업에 사용될 수 있다.
Sort Merge Join
- 조인 컬럼 기준으로 각 테이블을 먼저 정렬한 다음 조인을 수행한다.
- 인덱스를 사용하지 않는다.
- 넓은 범위의 데이터를 처리할때 이용되는 조인 기법이다. (거의 모든 데이터를 읽어야 할 때 사용한다.)
- 정렬할 데이터가 많을 경우 정렬 작업을 수행하는 도중 임시 영역(디스크)를 사용하기 때문에 성능이 저하될 수 있다.
- 동등 조인과 비동등조인에 대해서도 조인작업이 가능
- 앞 단계에서 정렬 작업이 수행되었다면 조인을 위한 정렬 작업이 발생하지 않을 수 있다.
Hash Join
- 조인 키를 기준으로 해쉬 함수를 적용하여 해쉬 테이블을 생성 한다.
- 결과가 정렬되지 않을 수 있음 - 동등 조인만 가능
- 선행 테이블의 데이터가 적은것이 효율적임 - 선행테이블의 데이터를 해싱하면서 해쉬테이블을 만들고 후행 테이블은 해쉬값 존재 유무만 판단하여 해쉬값이 있을때만 데이터를 헤시테이블에 저장한다. - 메모리 사용 효율이 좋아지며, 메모리 부족으로 디스크를 사용하는 경우를 줄여준다.
참조
책 : SQL 전문가 가이드 2013 Edition , KODB(한국데이터베이스진흥원)