입력 상태로 선택
같은 조인도 데이터 크기, 비교 방식, 정렬 여부가 다르면 선택이 달라진다.

옵티마이저는 조인 이름을 외우는 것이 아니라 어떻게 읽어야 가장 덜 비싼지를 본다. 그래서 소량 반복 조회, 대량 등가 조인, 정렬된 범위 조인은 서로 다른 방식이 자연스럽다.

비교 축
Nested Loop 작은 바깥 집합을 기준으로 내부를 반복 탐색
Hash Join 한쪽을 해시로 묶고 큰 집합을 한 번에 매칭
Sort Merge 정렬된 순서를 따라 두 입력을 나란히 전진
읽는 방식
바깥 행마다 내부를 다시 찾는다. 인덱스가 있으면 반복 조회 비용을 아주 낮게 만들 수 있다.
한쪽을 메모리 구조로 만든 뒤 같은 키를 바로 찾는다. 대량 데이터라도 = 비교를 단순한 매칭으로 바꾼다.
정렬 순서를 공유한 채 두 쪽 포인터를 함께 움직인다. 정렬만 확보되면 큰 집합도 순서대로 안정적으로 읽는다.
잘 맞는 상황
소량 결과 + 빠른 인덱스 접근 OLTP처럼 한 건씩 빨리 찾아야 할 때 유리하다.
대량 데이터 + 등가 조인 큰 테이블끼리 묶는 분석 쿼리에서 기본 후보가 된다.
이미 정렬됨 + 범위 비교 필요 정렬 결과나 인덱스 순서를 그대로 활용할 때 강하다.
조인 조건
인덱스로 내부를 찾을 수 있느냐가 핵심 조인 자체보다 접근 경로가 성능을 좌우한다.
= 조인에 가장 자연스럽다. 같은 키를 빠르게 묶는 데 최적화되어 있다.
>=, BETWEEN 같은 비동등 조인도 처리 가능 정렬 순서가 있으면 범위 조건을 따라 병합할 수 있다.
주의점
바깥 집합이 커지면 반복 비용이 급증 작은 쪽을 먼저 고르고 인덱스로 닿는지가 중요하다.
해시를 담을 메모리가 부족하면 부담이 커진다. 대량 처리에는 강하지만 빌드 비용이 공짜는 아니다.
정렬 비용을 새로 내면 오히려 손해 이미 정렬돼 있거나 인덱스로 정렬을 대체할 때 빛난다.
빠른 판단 1 작은 결과를 인덱스로 바로 찌를 수 있으면 Nested Loop부터 본다.
빠른 판단 2 큰 집합을 = 로 붙이면 Hash Join이 가장 자연스러운 기본값이다.
빠른 판단 3 정렬이 이미 준비됐거나 범위 조건이 있으면 Sort Merge가 살아난다.