티스토리 뷰

Where 절에 조건이 많을수록 쿼리의 처리속도는 떨어진다.
DB에 저장된 사이트 접속자를 분석하려 했을때
무수히 많은 레코드를 검색하는데 있어서 엄청난 자원소모와 속도저하가 일어났다.
이에, 새벽에 작업되도록 스케쥴링도 하였지만 그보다 먼저 생각해야될것이 쿼리의 개선이었다.

최초 쿼리는
Select Count(*) From [접속자기록_테이블] Where
referer Like '%naver.com%' and accessdate Between '2011-06-29' And '2011-06-29 23:59:59'
이와 같았고

아래와 같이 바꿔보았다
Select Count(*) From [접속자기록_테이블] Where
accessdate Between '2011-06-29' And '2011-06-29 23:59:59' And Charindex(referer, 'naver.com') > 0

[결론]
리퍼러 내의 단어 찾는 부분으로 Count(*)를 대체하면
Select isNull(sum(CASE WHEN charindex('naver.com', referer)=0 THEN 0 ELSE 1 END), 0) Where accessdate Between '2011-06-29' And '2011-06-29 23:59:59'

[설명]
(제일 안쪽부터 본다)

charindex('naver.com', referer)=0
리퍼러 값에 naver.com 들어있지 않은 레코드

CASE WHEN {조건} THEN 0 ELSE 1 END
{조건}이 맞으면 0 아니면 1

CASE WHEN charindex('naver.com', referer)=0 THEN 0 ELSE 1 END
리퍼러가 naver.com 가 아니면 0 맞으면 1
바꿔말하면, 리퍼러가 naver.com 일때만 1

위의 1들을 모두 SUM() 하면 COUNT() 와 같게 되는것이다. 

제일 바깥의 isNULL()은 NULL 값이 나올때는 0 으로 반환하는것이다.

[참고]
CASE WHEN {조건} THEN 0 ELSE 1 END 을 오라클에서는 함수로 제공한다.
DECODE({조건}, 0, 0, 1)
댓글