문제점 : 대규모 데이터셋에서 심각한 성능 저하가 나타날 수 있다.
1. NOT IN은 부정조건으로, 대부분의 DBMS에서 전체 테이블 스캔이나 인덱스 풀 스캔을 유발한다. 전체 데이터나 테이블을 스캔한 후 조건에 맞지 않는 레코드를 필터링 해야하기 때문에 데이터베이스 옵티마이저가 효율적인 실행 계획을 세우기 어렵다.
2. 인덱스를 효과적으로 활용하지 못한다. IN절은 인덱스 Range Scan을 통해 빠르게 처리할 수 있지만, NOT IN은 인덱스 활용도가 떨어진다.
3. 대량의 값을 IN절에 넣으면 실행 계획 생성이 늘어나고, 파싱 및 최적화 단계에서 추가적인 오버헤드가 발생한다.
4. NULL값 처리 로직으로 인한 예상치 못한 결과가 발생할 수 있다.
ex. column NOT IN(1, 2, NULL) 은 항상 빈 결과를 반환한다.
최적화 방안
1. NOT EXISTS 활용
: 행 단위로 평가되어 매핑되는 첫 행을 찾자마자 평가를 중단한다.
2. LEFT JOIN + IS NULL 패턴
: 서브쿼리 결과가 작을 때 효율적이다. 인덱스 효과적 사용이 가능하고 PK인덱스를 사용한 JOIN연산이 최적화된다
-> 데이터베이스가 가장 잘하는 '인덱스를 활용한 조인'을 수행한 뒤 필터링만 하는 구조라, 실행 계획이 매우 안정적이다.
'cs(with 매일메일)' 카테고리의 다른 글
| [260312목] 이벤트 소싱이란 무엇인가요? (0) | 2026.03.12 |
|---|---|
| [260311수] Statement와 PreparedStatement의 차이점은 무엇인가요? (0) | 2026.03.11 |
| [260309월] 최종적 일관성이란 무엇인가요? (0) | 2026.03.09 |
| [260306금] SQL 인젝션에 대해 설명해주세요. (0) | 2026.03.06 |
| [260305목] 테스트 격리란 무엇인가요? (0) | 2026.03.05 |