-
Chapter 3. JoinDatabase 2021. 2. 18. 00:32
1. Join의 종류
관계형 DB에서는 중복 데이터를 피하기 위해서 데이터를 여러 테이블로 나누어 저장한다. 이렇게 분리된 데이터에서 원하는 결과를 도출하기 위해서는 여러 테이블을 조합해야한다.
[그림 1] Join 예시 1. Cross Join [Cartisian Product]
특별한 조건없이 테이블 A의 각 행과 테이블 B의 각 행을 모두 조합한 결과이다. 참고로 교차 조인은 WHERE 문구 X
[그림 2] Cross Join 예시 2. Inner Join
교차 조인을 한 결과에 조인 조건문을 충족시키는 레코드를 반환한다. 동등 비교도 가능하나 값에 따라 범위 연산도 가능하다 [조건절에 employees.no between 1000 and 1004]
[그림 3] Inner Join 예시 3. Natural Join
두 테이블의 동일한 이름을 갖는 모든 컬럼들에 대해 같은 값을 가지는 레코드들을 반환한다. 동일한 이름을 가지는 컬럼은 모두 조인이 돼서 USING, ON, WHERE 등을 통해서 문제를 해결할 수 있다.
[그림 4] Natural Join ※ Inner Join과 Natural Join은 반횐되는 열이 다르다.
4. Outer Join
내부 조인의 경우 공통 컬럼명 기반으로 결과 집합을 생성했지만, 외부 조인은 조건문에 만족하지 않는 행도 표시해준다.
[그림 5] Left Outer Join 예시 [그림 6] Right Outer Join 예시 2. Join 동작 원리
[그림 7] Join 설명을 위한 예시 1. Nested Loop Join [가장 기본전인 Join 기법]
2개 이상의 테이블을 조인할 때 앞에서부터 차례대로 join 과정을 수행한다. 앞에 있는 것을 선행 테이블 뒤에 있는 것을 후행 테이블이라 하고 join 과정이 중첩 Loop와 비슷하게 동작한다. 먼저 두 테이블을 메모리로 복사한다. 이후 선행 테이블 한 행씩 조인키를 갖는 후행 테이블의 행을 찾는다. 이러한 과정이 선행 테이블 ROW 수만큼 반복 된다.
후행 테이블에서 JOIN Key 탐색과정이 자주 일어나므로, Index 작업이 없으면 굉장히 비효율적이다. 또한 선행 테이블 ROW 수만큼 반복되므로 선행 테이블은 ROW 수가 적으면 효율적이다.
Ex) 사원테이블에서 사원이름을 꺼내서 임시 작업 공간으로 가져간다. 그후 부서 테이블에서 해당 부서명을 찾으러 가는데 위 sql 3행 조건을 보고 해당 조건에 맞는 데이터를 찾아서 부서명을 가져온다. 한 행의 작업이 끝나면 다시 선행테이블로 돌아가서 두 번째 행 처리를 진행한다. 이러한 작업을 선행테이블 ROW 수만큼 반복적으로 진행한다. 하지만 인덱스 설정이 없을 경우 대량의 테이블에서는 성능이 좋지 않다.
2. Sorted Merge Join
조인 키를 기준으로 두 테이블을 정렬한 후 결과를 Merge해서 데이터를 찾는 방식이다. 만약 대용량의 후행 테이블의 인덱스가 없을 때 Nested Loop Join 방식은 너무 오래 걸린다. 물론 대량의 조인 작업에서 CPU 작업 위주로 처리하는 Hash Join이 성능상 유리하다. 하지만 Hash Join과는 달리 동등 조인 뿐만 아니라 범위 조인 작업이 가능한 장점이 있다.
3. Hash Join
두 테이블을 비교해 ROW 수가 적은 테이블을 메모리로 로드한다. JOIN 조건의 컬럼을 Hash 함수에 넣어 Value, Hash Value를 생성한다. 이후 2번째 테이블 JOIN 조건을 Hash 함수에 넣어 Value를 생성하고, 위에서 만들 hash Table 값과 비교해 맵핑한다.
해시 테이블을 메모리에 생성해야하고, 크기가 클 경우 임시 영역에 저장하기 때문에 결과 행 수가 적은 테이블을 선행 테이블로 사용한다.
동등 조인에서만 사용 가능하지만 대용량 처리에서 매우 효율적이다.
Sorted Merge Join은 정렬을 하기 때문에 범위 조인일 경우 적합하다. Hash Join은 인덱스가 없는 테이블에서 Join이 발생할 경우 선택하지만 경우에 따라, 인덱스가 있다 하더라도 Hash Join을 수행하는 경우도 종종 있다. 그만 큼 대용량 데이터 처리에서 우위를 갖는다.
'Database' 카테고리의 다른 글
Chapter 6. Partitioning (0) 2021.02.18 Chapter 5. Index (0) 2021.02.18 Chapter 4. Normalization (0) 2021.02.18 Chapter 2. SQL과 NoSQL (0) 2021.02.17 Chapter 1. Database Introduce (0) 2021.02.17