새소식

자격증 준비~

[ 친절한 SQL] Between을 IN-List로 전환

  • -
반응형

Between 조건절은 IN 조건절로 바꿔주면 큰 효과를 얻는 경우들이있다.

 

■ 예시

1) 기존 SQL

select 해당층, 펑당가, 입력일, 해당동, 매물구분, 연사용일수, 중개업소코드

from 매물아파트매매

where 아파트시세코드 A01011350900056'

and 평형 = '59'

and 평형타입 = 'A'

and 인터넷매물 between '1' and '3'

order by 입 력 일 desc

 

 

2) IN-List 변환 SQL

select 해당층, 평당가, 입력일, 해당동, 매물구분, 연사용일수, 중개업소코드

from 매물아파트매매

where 인터넷매물 in ( '1 ' , '2' , '3 ')

and 아파트시세코드 A01011350900056 '

and 평형 = '59'

and 평형타입 = 'A'

order by 입 력 일 desc

 

- Between 조건절로 INDEX를 탐색하였을때는 1번의 수직적 탐색이후 불필요한 리프 블록 탐색이 많다. 하지만 IN-List로 바꾸게되면 3번의 수직적탐색을하며 불필요한 리프 블록의 탐색을 줄일수있게된다.

 

 

■ BETWEEN 조건을 IN-List로 전환할 떄 주의사항

 

1. IN-List 갯수가 많을떄

- BETWEEN 조건을 IN-List조건으로 전환할떄는 IN-List  개수가 많지 않아야 한다는 것이다. IN-List 개수가 많아지면 대량의 수직적 탐색이 발생하게되고 BETWEEN 조건의 리프 블록을 많이 탐색하는 비효율보다 IN-LIst 조건의 브랜치 블록을 반복 탐색한는 비효율이 더 클 수 있다.

 

 

2. BETWEEN 조건의 범위가 좁을 경우

where 고객등급 between ' C' and 'D' and 고객번호 = 128

그림과 같이 둘사이에 놓인 인덱스 블록이 매우 소량인것을 볼수있다. 이럴때 BETWEEN을 IN-LIST로 변환하면 효과가 전혀 없거나 수직적 탐색 때문에 오히려 I/O가 많이 발생한다. 

 

 

■ 정리

정리하면, BETWEEN 조건 때문에 인덱스를 비효율적으로 스캔하더라도 블록 I/0 측면에 서는 대개 소량에 그치는 경우가 많다. 인덱스 리프 블록에는 테이블 블록과 달리 매우 많은 (8KB 블록 기준으로 대략 수백 개) 데코」三가 담기기 때문이다. 게다가 IN—List 개수가 많으면 수 직적 탐색 과정에서 이미 많은 블록을 읽게 된다. 데이터 분호 및 수직적 탐색 비용을 따져보지 않고 BETWEEN을 IN-List로 변환하는 잘못을 하지 않기를 바란다.

 

 

 

*참고:  친절한 SQL 튜닝(개발자를 위한 SQL 튜닝 입문서) 저자: 조시형

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.