본문 바로가기
공부/프로그래밍

[dbms] where에 In 절 사용 시 알아두면 좋은 것

by demonic_ 2020. 2. 27.
반응형

실무에서 in 절을 자주사용한다. 예를 들면 다음과 같은 경우다

select * 
from test_a a
where id in (1,2,3)

 

위 쿼리가 실행되면 id가 1,2,3인 row를 조회해서 가져온다.

in절은 row를 하나씩 점검하며 값이 존재하는지를 확인한다.

프로그램으로 보면 for 문을 돌리는 느낌이랄까.

그런데 In 절은 사실상 다음 같은 쿼리와 같은 결과를 낸다.

select *
from test_a
where id = 1

union all

select *
from test_a
where id = 2

union all

select *
from test_a
where id = 3

 

여기서 인덱스 여부가 중요하다. 인덱스가 설정되어 있는 칼럼이라면 위와 같은 접근이 훨씬 좋은 퍼포먼스를 내기 때문이다. 인덱스가 설정되어 있다면 위치를 알고 있기 때문에 equal로 직접 접근하는 것이 for 문을 통해 처음부터 끝가지다 수행/비교하는 것보다는 훨씬 좋은 퍼포먼스를 낸다. 그런데 index가 없는 칼럼이라면? 처음부터 하나씩 검토할 수밖에 없다.

사실 DBMS의 성능은 랜덤액세스와의 전쟁이라 해도 과언이 아니다. 쿼리를 길게 쓴다고 해서 문제 되지 않는다는 의미다. for를 통해 데이터를 검토하는 것은 row 수가 적으면 별문제가 되지 않지만, 데이터가 100만, 1000만 건이 되면 일일이 조건 비교하는 것이 엄청난 비용을 발생하게 한다. 하지만 인덱스가 설정되어 있는 칼럼이라면 데이터를 정확한 곳에서 액세스 가능하게 되고, 랜덤액세스가 줄어든다는 의미다. 그럼 전체를 for 문으로 수행하는 것보다 훨씬 좋은 퍼포먼스를 낸다.

 

반응형

댓글