본문 바로가기

cs(with 매일메일)

[260310화] NOT IN쿼리를 사용할 때 발생할 수 있는 문제와 최적화 방법에 대해 설명해 주세요.

문제점 : 대규모 데이터셋에서 심각한 성능 저하가 나타날 수 있다. 

 

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연산이 최적화된다

-> 데이터베이스가 가장 잘하는 '인덱스를 활용한 조인'을 수행한 뒤 필터링만 하는 구조라, 실행 계획이 매우 안정적이다.