← 질문 목록
#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이 될 수 없는 우측 컬럼으로 검사해야 같은 결과가 된다.

추천 꼬리질문

0/300

적은 내용은 AI 학습에 쓰일 수 있습니다. 이름이나 연락처는 넣지 말아 주세요.

관련 질문

EXISTS와 IN을 조인으로 바꾸면 무엇이 다른가?