← 질문 목록
#49깊이 0
EXISTS와 IN을 조인으로 바꾸면 무엇이 다른가?
서브쿼리에 중복 데이터가 있을 때 일반 조인으로 변환하면 결과 행이 늘어나는 문제와 NULL 값 평가 메커니즘의 차이다.
| 기준 | IN / EXISTS 서브쿼리 | 일반 INNER JOIN 변환 |
|---|---|---|
| 결과 건수 | 일치하는 메인 행만, 중복 증식 없음 | 서브쿼리 중복 시 행 수 증가 |
| NULL 처리 | IN은 일치값이 있으면 TRUE, 일치값 없이 NULL만 있으면 UNKNOWN. EXISTS는 행이 있는지만 본다 | ON 조건 절칙에 따라 평가 |
IN과 EXISTS는 있는지만 보는 세미 조인의 의미를 갖고, 변환 조건이 맞으면 실제로 세미 조인으로 돈다. 그래서 서브쿼리에 중복이 있어도 결과 행이 늘지 않는다.
반면 그냥 INNER JOIN으로 바꾸면 1:N 관계 때문에 결과가 부푼다.
중복 뻥튀기를 막으려면 조인 변환 시 중복 제거가 필요하다 — 우측 키가 유일하면 안 붙여도 된다. 그러나 최신 RDBMS 옵티마이저는 IN과 EXISTS를 내부적으로 세미 조인 알고리즘으로 자동 최적화하므로 무조건 조인으로 바꿀 필요는 없다.
부정 조건인 NOT IN을 변환할 때는 NULL 처리를 조심해야 한다.
NOT IN 서브쿼리에 NULL이 섞여 있으면 결과가 전부 비어버리지만, NOT EXISTS는 NULL 비교를 일치로 세지 않아 기대대로 평가되고, LEFT OUTER JOIN 변환은 NULL이 될 수 없는 우측 컬럼으로 검사해야 같은 결과가 된다.