조인 수행 원리
조인이란 두 개 이상의 테이블을 하나의 집합으로 만드는 연산이다.
SQL 문에서 FROM 절에 두 개 이상의 테이블이 나열될 경우 조인이 수행된다.
조인 연산은 두 테이블 사이에서 수행된다.
FROM 절에 A, B, C라는 세 개의 테이블이 존재하더라도 세 개의 테이블이 동시에 조인이 수행되는 것은 아니다.
세 개의 테이블 중에서 먼저 두 개의 테이블에 대해 조인이 수행된다.
그리고 먼저 수행된 조인 결과와 나머지 테이블 사이에서 조인이 수행된다.
이러한 작업은 FROM절에 나열된 모든 테이블을 조인할 때까지 반복 수행한다.
NL Join
NL Join은 프로그래밍에서 사용되는 중첩된 반복문과 유사한 방식으로 조인을 수행한다.(for 문)
외부에 있는 테이블을 선행 테이블 또는 외부 테이블(Outer Table)리가고 하고,
반복문의 내부에 있는 테이블을 후행 테이블 또는 내부 테이블(Inner Table)이라고 한다.
NL Join 작업방법은 다음과 같다.
- 선행 테이블에서 주어진 조건을 만족하는 행을 찾는다.
- 선행 테이블의 조인 키 값을 가지고 후행 테이블에서 조인 수행
- 선행 테이블의 조건을 만족하는 모든 행에 대해 1번 작업 반복 수행
Sort Merge Join
Sort Merge Join은 조인 칼럼을 기준으로 데이터를 정렬하여 조인을 수행한다.
NL Join은 주로 Random Access 방식으로 데이터를 읽는 반면 Sort Merge Join은 주로 스캔 방식으로 데이터를 읽는다.
Sort Merge Join은 Random Access로 NL Join에서 부담이 되던 넓은 범위의 데이터를 처리할 때 이용되던 조인 기법이다.
그러나 Sort Merge Join은 정렬할 데이터가 많아 메모리에서 모든 정렬 작업을 수행하기 어려운 경우에는
임시 영역(디스크)를 사용하기 때문에 성능이 떨어 질 수도 있다. 일반적으로 대량의 조인작업에서 정렬 작업을 필요로 하는 Sort Merge Join보다는 CPU 작업 위주로 처리하는 Hash Join이 성능상 유리하다.
그러나 Sort Merge Join은 Hash Join과 달리 동등 조인 뿐만 아니라 비동등 조인에 대해서도 조인 작업이 가능하다는 장점이 있다.
Hash Join
Hash Join은 해슁 기법을 이용하여 조인을 수행한다.
조인을 수행할 테이블의 조인 칼럼을 기준으로 해쉬 함수를 수행하여 서로 동일한 해쉬 값을 갖는 것들 사이에서
실제 값이 같은지를 비교하면서 조인을 수행한다. Hash Join은 NL Join의 랜덤 액세스 문제점과 Sort Merge Join의
문제점인 정렬 작업의 부담을 해결하기 위한 대안으로 등장하였다.
Summary
- NL Join (Nested Loop Join)
이중 for문과 같은 원리- 따라서 매우 비효울적, 오래걸림
- 조인 조건의 인덱스 유무에 영향을 받음
- 유니크 인덱스를 활용
- OLTP 환경 (= 온라인 환경)의 쿼리에 적절하다.
- 조인 컬럼에 적당한 인덱스가 없어서 자연 조인(Natural Join)이 효율적일 때 유리하다.
- Outer table이 성능에 매우 중요한 요인
- Sort Merge Join
- NL Join과 비슷하게 중첩 for문과 같은 원리
- 두 테이블을 조인 컬럼 기준으로 데이터를 정렬 시킨 후 Join 하는 방식이 차이점이다.
- 넓은 범위의 데이터를 처리할 때 주로 이용된다.
- 조인 조건의 인덱스 유무에 영향을 받지 않는다.
- Outer Table 이 필요하지 않ㄴ다.
- 비동등 조인에 대해서도 조인이 가능하다.
- PGA영역에서 Sorting이 수행된다.
- Hash Join
- NL Join의 랜덤액세스 문제점을 해결하기 위해 나왔다.
- 정렬할 작업이 필요없어 정렬 부담되는 대량 배치작업에 유리하다.
- Outer Table이 성능에 매우 중요한 요인이다.
- 대용량 테이블을 Join할 때 사용하면 좋다.
- 인덱스가 존재하지 않는 경우에 사용 가능하다.
- '='로 수행하는 Equal JOIN(동등 조인)만 사용 가능
- DW 환경 등에서 데이터를 집계하는 업무에 많이 사용된다.
- 테이블 사이즈가 충분히 작아야 성능 유리
- 수행 빈도가 높은 OLTP 환경에서 수행하면, 오히려 CPU나 메모리 사용량이 증가한다.
# Ref:
'Language > RDBMS' 카테고리의 다른 글
사용자 생성 및 권한 부여 (0) | 2023.04.17 |
---|---|
인덱스 기본 (0) | 2023.03.19 |
옵티마이저와 실행계획 (0) | 2023.03.19 |
계층형 질의 (0) | 2023.03.16 |
[SQLD]Prev-Exam Solving (30st) (0) | 2023.03.15 |