IN 절 vs EXISTS 절 – 조건은 같아도 성능은 다르다
반응형
SMALL
IN과 EXISTS는 둘 다 서브쿼리를 사용하는 조건절로, 결과적으로 같은 데이터를 반환할 수 있지만 내부 동작 방식과 성능 차이로 인해 상황에 따라 적절한 선택이 필요합니다.
1. IN 절과 EXISTS 절의 기본 사용법
IN 절 예시:
SELECT name
FROM employee
WHERE department_id IN (
SELECT id
FROM department
WHERE region = '서울'
);
EXISTS 절 예시:
SELECT name
FROM employee e
WHERE EXISTS (
SELECT 1
FROM department d
WHERE d.id = e.department_id
AND d.region = '서울'
);
위 두 쿼리는 동일한 결과를 반환하지만, 내부적으로 처리하는 방식은 전혀 다릅니다.
2. 내부 동작 방식의 차이
- IN은 서브쿼리 결과를 메모리에 모두 로드하고, 메인 쿼리의 비교 값을 그 목록과 매칭합니다.
- EXISTS는 서브쿼리가 조건을 만족하는 레코드가 하나라도 존재하는지 확인하는 방식으로, 참(True)이 되는 순간 바로 반환됩니다.
즉, EXISTS는 조건을 만족하는 레코드를 찾자마자 종료되는 반면, IN은 전체 리스트를 끝까지 확인하는 구조입니다.
3. 성능 차이 – 언제 어느 걸 쓰는 게 좋을까?
- 서브쿼리의 결과가 매우 많은 경우 → EXISTS가 더 유리한 경우가 많습니다.
- 서브쿼리의 결과가 작고 명확한 리스트라면 IN이 더 직관적이고 성능상 문제가 없습니다.
- 서브쿼리에 NULL이 포함될 가능성이 있다면 EXISTS를 쓰는 것이 안전합니다.
4. 실무 팁
- Oracle에서는 IN과 EXISTS의 성능 차이가 DB 버전이나 옵티마이저 설정에 따라 달라질 수 있으므로, 항상 실제 실행 계획(EXPLAIN PLAN)을 통해 비교하는 것이 가장 정확합니다.
- WHERE 절 내 조건의 순서가 성능에 미치는 영향도 함께 고려해 조합적으로 테스트하는 습관이 필요합니다.
IN과 EXISTS는 비슷해 보이지만 그 사용 방식과 성능은 꽤 다릅니다. 단순히 동작만 이해할 것이 아니라, 각 조건의 구조와 서브쿼리 특성에 맞춰 쿼리를 작성해야 최적화된 결과를 얻을 수 있습니다.
#SQL기초 #IN절 #EXISTS절 #SQL서브쿼리 #SQL성능비교 #쿼리최적화
반응형
LIST
'SQL 기초 정리' 카테고리의 다른 글
뷰(View)와 테이블의 차이 – 언제 뷰를 쓰고 언제 테이블을 써야 할까? (0) | 2025.04.14 |
---|---|
ORDER BY의 숨겨진 비용 – 정렬은 왜 성능을 떨어뜨릴까? (0) | 2025.04.13 |
LIKE 연산자의 와일드카드(%, _) 정확히 알고 쓰기 (0) | 2025.04.12 |
CTE(Common Table Expressions)의 활용법 – 서브쿼리보다 명확한 쿼리 작성 (0) | 2025.04.12 |
CASE WHEN 구문의 활용법 – 조건 분기와 표현식을 동시에 해결하는 방법 (0) | 2025.04.11 |