[SQL] Join(hash, nested loop, merge)?

뚝딱쓰·2024년 7월 23일
0

Database

목록 보기
1/1

데이터베이스 조인

1. 해시 조인 (Hash Join)

개요:
해시 조인은 대용량 테이블 조인에 적합하며, 두 테이블 중 하나가 메모리에 적합할 때 사용됩니다. 이는 주로 조인 조건이 = (등호)일 때 사용됩니다.

작동 방식:

  1. 빌드 단계:

    • 더 작은 테이블을 선택합니다(일반적으로 더 작은 테이블을 메모리에 올리기 쉽기 때문입니다).
    • 이 테이블의 조인 컬럼을 기반으로 해시 테이블을 생성합니다. 해시 함수는 입력값을 특정 버킷(bucket)으로 매핑합니다. 이 버킷은 실제 메모리 내의 저장 위치를 나타냅니다.
    • 각 행의 조인 키를 해시 함수에 입력하여 해시 값을 계산하고, 그 해시 값을 사용하여 해당 행을 해시 테이블에 저장합니다.
  2. 프로브 단계:

    • 큰 테이블의 각 행을 읽고, 해당 행의 조인 키에 해시 함수를 적용하여 해시 값을 얻습니다.
    • 그 해시 값을 사용하여 해시 테이블에서 일치하는 버킷을 찾습니다.
    • 버킷에서 해당 행이 존재하는지 확인하고, 조인 조건에 부합하는 행이 있다면 두 행을 결합하여 결과 집합에 추가합니다.

장점:

  • 매우 빠른 조회가 가능하며, 대량의 데이터를 다룰 때 효율적입니다.

단점:

  • 메모리 사용량이 많을 수 있습니다.
  • 해시 테이블을 생성하는 데 시간이 소요될 수 있습니다.

예시:
고객 정보와 주문 정보를 조인한다고 가정할 때, 고객 정보가 메모리에 올릴 수 있는 크기라면 고객 정보를 해시 테이블로 만들어 주문 정보의 각 행을 탐색하며 일치하는 고객 정보를 찾습니다.

2. 중첩 루프 조인 (Nested Loop Join)

개요:
중첩 루프 조인은 가장 기본적이고 직관적인 조인 방법으로, 두 테이블을 비교하여 조인하는 방식입니다. 두 테이블의 모든 조합을 비교하기 때문에 성능은 비교적 떨어질 수 있습니다.

작동 방식:

  1. 외부 루프:

    • 첫 번째(외부) 테이블의 각 행을 순차적으로 선택합니다.
  2. 내부 루프:

    • 두 번째(내부) 테이블의 각 행을 선택하고, 외부 테이블의 현재 행과 비교합니다.
    • 두 행이 조인 조건을 만족하면 이 두 행을 결합하여 결과에 추가합니다.

장점:

  • 구현이 간단하며, 작은 테이블이나 인덱스가 있는 경우 매우 효과적입니다.

단점:

  • 두 테이블의 크기가 크면 비효율적이며, 성능이 저하됩니다. 이는 모든 행의 모든 조합을 비교하기 때문입니다.

예시:
제품 정보와 그 제품의 공급업체 정보를 조인할 때, 각 제품을 하나씩 읽어 해당 제품을 공급하는 공급업체를 하나씩 비교하여 찾습니다.

3. 병합 조인 (Merge Join)

개요:
병합 조인은 두 테이블이 조인 키로 정렬되어 있을 때 사용하는 조인 방식입니다. 정렬된 데이터를 순차적으로 읽으며 조인을 수행하기 때문에 대용량의 정렬된 데이터를 조인할 때 매우 효율적입니다.

작동 방식:

  1. 정렬:

    • 두 테이블이 조인 키로 정렬되어 있어야 합니다. 정렬이 되어 있지 않으면 먼저 정렬합니다.
  2. 순차 비교:

    • 각 테이블의 시작 지점에서부터 조인 키를 비교합니다.
    • 두 테이블의 조인 키가 같으면, 해당 행들을 결합하여 결과에 추가합니다. 이후, 두 테이블 모두 다음 행으로 이동합니다.
    • 만약 한 테이블의 조인 키가 더 작다면, 작은 키의 테이블만 다음 행으로 이동하여 비교를 계속합니다.

장점:

  • 데이터가 정렬되어 있다면 매우 효율적입니다.
  • 대량의 데이터를 처리할 때 성능이 뛰어납니다.

단점:

  • 데이터가 정렬되지 않은 경우, 정렬하는 데 추가적인 비용이 발생합니다.

예시:
판매 데이터와 고객 데이터를 조인할 때, 두 데이터가 고객 ID로 이미 정렬되어 있다면, 첫 번째 고객부터 순차적으로 비교하여 조인 결과를 생성합니다.

최종 정리

이 세 가지 조인 방식은 각각의 데이터 크기, 정렬 여부, 인덱스 존재 여부 등에 따라 적절히 선택되어야 합니다. 데이터베이스 엔진은 이러한 정보를 기반으로 최적의 조인 방식을 자동으로 선택하여 쿼리 성능을 최대화합니다. 조인을 잘 이해하고 있으면 SQL 쿼리의 성능을 향상시키는 데 큰 도움이 됩니다.

profile
우당탕탕 코린이

0개의 댓글