이번 블로그에서는 조인에 대해서 정리해보고자 한다.
조인
- 조인이란 하나의 테이블이 아닌 두 개 이상의 테이블을 묶어서 하나의 결과물을 만드는 것을 의미한다.
- MySQL은 JOIN 쿼리를 사용하고 MongoDB에서는 lookup이라는 쿼리를 사용한다.
(하지만 MongoDB에서는 조인에 대한 성능이 떨어져 되도록이면 사용하면 안된다)
1. 종류
1. 내부 조인 (교집합) : 왼쪽 테이블과 오른쪽 테이블의 두 행이 모두 일치하는 행이 있는 부분만 결과 테이블에 표기
- DEFAULT
- INNER 사용
- 예를 들어, TABLEA에 데이터 중 TABLEB의 데이터와 연결되는 데이터가 없을 시, 해당 TABLEA의 데이터는 반환하지 않는다.
SELECT A.name, B.name FROM TABLEA A
INNER JOIN TABLEB B ON
A.key = B.key
2. 왼쪽 조인 (집합A) : 왼쪽 테이블의 모든 행이 결과 테이블에 표기
- LEFT 사용
- TABLEA에 데이터 중 TABLEB의 데이터와 연결되는 데이터가 없을 시, TABLEB에서 찾으려는 칼럼 중 없는 부분을 Null로 반환
SELECT A.name, B.name FROM TABLEA A
LEFT JOIN TABLEB B ON
A.key = B.key
3. 오른쪽 조인 (집합B) : 오른쪽 테이블의 모든 행이 결과 테이블에 표기
- RIGHT 사용
- TABLEA에 데이터 중 TABLEB의 데이터와 연결되는 데이터가 없을 시, TABLEA에서 찾으려는 칼럼 중 없는 부분을 Null로 반환
SELECT A.name, B.name FROM TABLEA A
RIGHT JOIN TABLEB B ON
A.key = B.key
4. 합집합 조인 (합집합) : 두개의 테이블을 기반으로 조인 조건에 만족하지 않는 행까지 모두 표기
- FULL OUTER 사용
- TABLEA에 데이터 중 TABLEB의 데이터와 연결되는 데이터가 없을 시, 모든 칼럼 중 없는 부분을 Null로 반환
SELECT A.name, B.name FROM TABLEA A
FULL OUTER JOIN TABLEB B ON
A.key = B.key
2. 원리
- 조인의 동작은 중첩 루프 조인, 정렬 병합 조인, 해시 조인 등의 원리로 이루어진다. 하지만 개발자는 직접적으로 RDBMS의 이런 조인 원리를 설정하지 못한다. 특수한 경우에 힌트를 주면서 설정할 수는 있지만 개발자가 설정하는 것이 아닌 옵티마이저라는 커포넌트가 여러가지 상황을 고려해 최적의 조인을 선택한다.
1. 중첩 루프 조인
- DEFAULT
- 중첩 for문과 같은 원리
- 랜덤 접근에 대한 비용이 많이 증가하므로 대용량 테이블에서는 사용하지 않는다.
- 예를들어, 테이블 A의 키와 B의 키가 같은 행 출력시 A의 키 하나하나를 B의 키 전체와 비교하는 방식
- 블록 중첩 루프 조인 : 조인할 테이블을 작은 블록으로 나눠서 블록 하나씩 조인하는 방식
2. 정렬 병합 조인
- 각각의 테이블을 조인할 필드 기준으로 정렬하고 정렬이 끝난 이후에 조인 작업을 수행하는 조인
- 조인할 때 쓸 적절한 인덱스가 없고 대용량의 테이블들을 조인하고 <, > 등의 비교 연산자 존재 시 사용
3. 해시 조인
- 해시 테이블을 기반으로 조인하는 방법 {Key : Value}, 시간복잡도 평균 : O(1)
- 두개의 테이블을 조인한다고 했을 때 하나의 테이블이 주메모리(인메모리)에 온전히 들어간다면 보통 중첩 루프 조인보다 더 효율적이다.
- 메모리에 올릴 수 없을 정도로 크다면 디스크를 사용하는 비용이 발생한다.
- 동등(=) 조인에서만 사용가능하다.
단계
1. 빌드 단계
- 입력 테이블 중 하나를 기반으로 메모리 내 해시 테이블을 빌드하는 단계
- 두 테이블 중에 바이트가 더 작은 테이블을 기반으로 해서 테이블을 빌드
- 조인에 사용되는 필드가 해시 테이블의 키로 사용된다.
2. 프로브 단계
- 레코드를 읽기 시작하며, 각 레코드에서 해시 테이블의 키와 일치하는 레코드를 찾아서 결과값으로 반환
- 각 테이블은 한 번씩만 읽게 되어 중첩해서 두 개의 테이블을 읽는 중첩 루프 조인보다 성능이 더 좋다.
- 사용 가능한 메모리 양은 시스템 변수 join_buffer_size에 의해 제어되며, 런타임 시에 조정 가능하다.
'CS Knowledge > DataBase' 카테고리의 다른 글
DataBase - Plus (1) | 2023.10.17 |
---|---|
DataBase - Index (0) | 2023.04.26 |
DataBase - Type (1) | 2023.04.25 |
DataBase - Transaction and Integrity (0) | 2023.04.25 |
DataBase - ERD, 정규화 (0) | 2023.04.05 |