DBDBDEEP
IN 조건이 '='으로 해석될 수 있는지 본문
BETWEEN을 IN-LIST로 변경하면서 본 바와 같이 IN 조건을 '='로 동등시 할 수 있다는 점이 있다.
IN조건은 '='이 아니다.
| select * from 고객별가입상품 where 고객 번호 = : cust_no and 상품ID in ( ' NH00037 ' , ' NH00041 ' , ' NH00050 ' ); |
인덱스를 [상품ID+고객번호] 순으로 생성하면,
같은 상품은 고객번호 순으로 정렬된 상태로 하나(또는 연속된 두개)의 리프 블록에 저장된다.
반면 고객번호 기준으로는 같은 고객번호가 상품 ID에 따라 뿔뿔이 흩어진 아래와 같은 상태가 된다.

이 경우는 상품ID 조건절이 IN-LIST Iterator 방식으로 풀리는 것이 효과적이다.
(1234가 멀리 떨어져 있기 때문)
select * from 고객별가입상품 where 고객번호 = :cust_no and 상품ID = ' NH00037 ' union all select * from 고객별가입상품 where 고객번호 = :cust_no and 상품ID = ' NH00041 ' union all select * from 고객별가입상품 where 고객번호 = :cust_no and 상품ID = ' NH00050 '
이걸 의미하는데 이렇게 하면 고객번호와 상품번호 모두 액세스 조건이 된다.
즉 IN 조건이 '='이 되려면 IN-LIST Iterator로 풀려야만 한다.
그렇지 않으면 IN 조건은 필터 조건이다.
'친절한 SQL 튜닝' 카테고리의 다른 글
| 4.1 NL 조인 (0) | 2026.05.18 |
|---|---|
| LIKE/BETWEEN 조건 활용 (0) | 2026.05.18 |
| 3.3.5 인덱스 선행 컬럼이 등치(=) 조건이 아닐 때 (0) | 2026.05.18 |
| 3.3.3 액세스/필터 조건 (0) | 2026.05.18 |
| 3.2.3 배치 I/O (0) | 2026.05.18 |