Nested Loop Join(NL Join, 중첩 루프 조인)
동작 원리 : 외부 테이블(Outer)의 각 행마다 내부 테이블(Inner)를 순회해서 매칭되는 행을 찾는 방식
즉, 이중 for문 구조처럼 작동한다.
-- 예시
SELECT *
FROM employees e
JOIN departments d ON e.dept_id = d.id;
-- 실제 실행 개념
for each row in employees
for each row in departments
if (e.dept_id == d.id)
return row
항목 내용
| 사용 조건 | 조인 키에 인덱스가 존재할 때 매우 효율적 |
| 시간 복잡도 | O(N * M) (단, 인덱스 없을 시 급격히 느려짐) |
| 장점 | 즉시 결과 반환 가능, 인덱스 기반 랜덤 액세스 |
| 단점 | 내부 테이블 크거나 인덱스 없으면 성능 급락 |
실무 예시
1. 한 쪽 테이블이 작고, 다른 쪽에 인덱스가 잘 잡혀 있을 때
2. 예: user_id로 주문 내역 조회(주문 테이블에 인덱스 있음)
Hash Join(해시 조인)
동작 원리: 조인키를 기준으로 작은 테이블을 해시 테이블로 만들고 큰 테이블을 스캔하여 해시 매칭으로 조인하는 방식
-- 예시
SELECT *
FROM orders o
JOIN customers c ON o.customer_id = c.id;
-- 실행 개념
Build phase: customers → 해시 테이블 생성
Probe phase: orders → 해시 테이블에서 customer_id 일치 여부 검색
항목 내용
| 사용 조건 | 조인 컬럼에 인덱스 없어도 가능 |
| 장점 | 대용량 테이블 간 조인에도 효율적 |
| 단점 | 해시 테이블 생성 시 메모리 사용량 많음 |
| 시간 복잡도 | O(N + M) |
실무 예시
1. 대용량 조인, 인덱스 없는 컬럼 조인
2. 예: 월별 통계 계산, 로그 + 사용자 정보 병합
Sort-Merge Join(SM Join, 정렬 병합 조인)
동작 원리: 양쪽 테이블을 조인 키 기준으로 정렬한뒤, 정렬된 상태에서 한 번에 병합 하는 방식
-- 예시
SELECT *
FROM sales s
JOIN region r ON s.region_id = r.id;
-- 실행 개념
1. sales, region 각각 조인 키 기준 정렬
2. 정렬된 두 집합을 병합하면서 일치하는 행 연결
항목 내용
| 사용 조건 | 두 테이블 모두 정렬된 상태일 때 가장 효율적 |
| 장점 | 정렬된 대량 데이터 처리에 적합 |
| 단점 | 정렬 과정 비용 큼, 인덱스 없으면 임시 정렬 필요 |
| 시간 복잡도 | O(N log N + M log M) |
실무 예시
1. 대용량 정렬 데이터 조인
2. 예: 날짜, 타임스탬프 기반 로그 조인
비교 요약표
| 조인 방식 | 원리 | 인덱스 필요 | 장점 | 단점 | 적합한 상황 |
| Nested Loop Join | 외부→내부 반복 검색 | ✅ 필요 | 인덱스 있을 때 빠름 | 인덱스 없으면 느림 | 작은 테이블 + 인덱스 존재 |
| Hash Join | 해시 테이블 빌드 후 매칭 | ❌ 불필요 | 대용량 처리 빠름 | 메모리 많이 사용 | 대용량 + 인덱스 없음 |
| Sort-Merge Join | 양쪽 정렬 후 병합 | ❌ 불필요 | 정렬 데이터 조인 효율 | 정렬 비용 큼 | 이미 정렬된 데이터 |
정리 한 줄 요약
인덱스 있으면 -> Nested Loop Join
인덱스 없어도 대용량이면 -> Hash Join
둘 다 정렬되 있으면 -> Sort-Merge Join
반응형