OUTER JOIN이 느려지는 핵심

매칭 실패 행도 남겨야 해서 실행 계획이 덜 자유로워집니다.

성능 이슈를 볼 때는 기능 이름보다 무엇을 끝까지 보존해야 하는지를 먼저 보면 됩니다. OUTER JOIN은 그 보존 규칙 때문에 읽는 양과 후속 처리 비용이 쉽게 커집니다.

공통 전제 일치하지 않은 행도 결과에서 버릴 수 없습니다.

초기에 제외하지 못하므로 보존 대상이 조인 이후 단계까지 계속 따라갑니다.

계획 제약 조인 순서와 조건 재배치 폭이 줄어듭니다.

같은 의미를 유지해야 하므로 더 싼 실행 계획으로 바꾸기 어려운 경우가 많습니다.

최종 비용 스캔, 정렬, 메모리, 결과 폭 부담이 함께 커집니다.

남겨 둔 행을 끝까지 들고 가야 해서 I/O와 후속 연산 비용이 퍼집니다.

1. 정말 OUTER JOIN이 필요한가

우선 확인

보존할 이유가 없다면 INNER JOIN으로 바꾸는 것이 가장 큰 비용 원인을 바로 제거합니다.

2. 조인 키 인덱스로 탐색을 줄이기

접근 경로

보존된 행에 붙일 대상을 빨리 찾게 해야 합니다. 조인 컬럼 인덱스가 느리면 OUTER JOIN 비용이 곧바로 커집니다.

3. SELECT * 대신 결과 폭 축소

후속 비용

OUTER JOIN은 결과가 넓어지기 쉬우므로 필요한 컬럼만 가져와 I/O, 정렬, 메모리 사용을 함께 줄입니다.

4. 조건을 ON/WHERE에 의도대로 배치

의미 보존

조건 위치가 어긋나면 보존해야 할 행을 뒤에서 다시 걸러 결과 의미도 바뀌고, 성능 문제처럼 보이는 왜곡도 생깁니다.

읽는 순서

OUTER JOIN 필요성을 먼저 줄이고, 남겨야 한다면 탐색 비용과 결과 폭을 줄이며 조건 위치를 정확히 잡는 순서로 점검합니다.