오라클(oracle) 등 DB에서 IN절과 '=' 개념 차이 확인 :: 개발/일상_Mr.lee

오라클(oracle) 등 DB에서 IN절과 '=' 개념 차이 확인

Posted by Mr.mandu.
2022. 8. 30. 21:56 개발/DB

안녕하세요.

 

DB 쿼리를 사용할때 '='를 사용하는 경우와 IN절을 사용하는 경우가 있으신가요?

 

저는 대부분 여러개의 키를 잡을때 IN절을 사용하기는하는데, 가끔 귀찮으면 '='와 혼용해서 사용하기도 합니다.

 

그래서 문득 차이점이 궁금해 공부해보고자 합니다.

 

저는 책 '친절한 SQL 튜닝'을 참고하였습니다. 

 

다음과 같은 쿼리가 있다.

select * from 고객별가입상품
where 고객번호 = 'cust_no'
and 상품 id in ('01', '03', '05')

 

인덱스를 '상품id+고객번호' 순으로 생성하면,

같은 상품은 고객번호 순으로 정렬된 상태로 하나의 블록에 지정된다.

 

반면,

고객번호 기준으로는 같은 고객번호가 상품id에 흩어진 상태가 된다.

 

인덱스가 이렇게 구성되어 있다면, 상품ID 조건절이 IN-List Iterator 방식으로 풀리는 것이 효과적이다.

-> 해석하면, '5678'고객 기준으로 검색을 할때

상품 '01', '03', '05'가 연속되어있지 않다는 뜻인거 같습니다.

그렇게 되면 상품id는 필터 조건이므로 테이블 전체 또는 인덱스 전체를 스캔하면서 필터링 합니다.

 

이렇게 떨어져 있는 부분을 union 으로 해결 할 수가 있다.

union에 대한 부분은 이전에 포스팅 한적이 있습니다.

[개발/DB] - [오라클]oracle 여러 테이블 컬럼 select (union all)

 

다시 돌아와서 union을 활용하여 어떻게 쿼리를 적었는지 확인해 보겠습니다.

 

select * 
from 고객별가입상품
where 고객번호 = 'cust_no'
and 상품id = '01'

union all

select * 
from 고객별가입상품
where 고객번호 = 'cust_no'
and 상품id = '03'

union all

select * 
from 고객별가입상품
where 고객번호 = 'cust_no'
and 상품id = '05

 

이런식의 쿼리가 되면 위에서 말한 IN-List Iterator 방식으로 되며

고객번호와 상품id 둘 다 인덱스 엑세스 조건으로 사용됩니다.

 

인덱스를 정상적으로 사용하려면 수직적 탐색을 통해 스캔 시작점을 찾아야 하기 때문입니다.

 

하지만, 이러한 방법이 항상 효과적일까요?

이러한 방법을 사용하고자 할때는 상품별 데이터가 아주 많아야 합니다.

그렇지 않은 상황에서는 상품id는 필터 방식으로 처리되는게 오히려 낮을 수 있습니다.

 

이렇게 IN절과 '=' 개념에 대해서 알아봤는데요.

저도 적으면서 계속 생각하면서 적었네요.

 

인덱스 조건이어도 IN절을 활용하게 되면 필터링(전체스캔)을

한다는 정도만 염두해두면 될겉 같습니다.

 

모두 좋은 하루 보내세요.