← 질문 목록
#22깊이 0
서브쿼리를 언제 조인으로 재작성해야 성능이 향상되는가?
옵티마이저는 조인 쪽에서 더 많은 경로를 살펴본다. 서브쿼리로 두면 블록 단위로만 최적화돼 전체를 보는 기회를 놓치기 쉽다.
| 기준 | 서브쿼리 | 조인 (Join) |
|---|---|---|
| 실행 방식 | 독립된 블록 또는 반복 실행 | 다양한 조인 알고리즘 선택 |
| 결과 행 수 | 안쪽 중복으로 바깥 행이 늘지 않음 | 관계에 따라 중복 발생 가능 |
| 최적화 범위 | 언네스팅되지 않으면 블록 안으로 제한 | 조인 순서·알고리즘 후보가 넓어짐 |
상관 서브쿼리는 외부 행마다 다시 도는 모양이라 느려 보인다. 다만 옵티마이저가 조인으로 펴면 반복 평가를 피할 수 있다 — 실제 횟수는 고른 조인 계획에 달렸다. 실행 계획을 봐야 안다.
조인으로 바꿀 때는 일대다에서 행이 불어나는 것을 조심한다.
IN이나 EXISTS처럼 있는지만 보는 서브쿼리는 안쪽에 중복이 있어도 바깥 행 수를 안 늘린다. 단순 조인으로 바꾸면 안쪽 키에 중복이 있는 한 DISTINCT나 GROUP BY를 붙여야 한다. 그러면 오히려 느려진다.
옵티마이저는 조건이 맞는 서브쿼리를 언네스팅해 조인으로 바꿀 수 있다.
개발자가 성능 개선을 위해 수동으로 변환하기 전에, 옵티마이저의 실행 계획을 먼저 확인하고 자동 최적화가 작동하지 않고 실측에서 이득이 확인될 때만 수동으로 변환한다.