쓸만한 주저리

[DBMS] [mssql] group by + case와 where+group by의 비교

봄돌73 2013. 2. 6. 15:36


-- groupby+case 

select 

sum(j), 

sum(r) 

from ( 

select 

COUNT(distinct case vote when 'J' then id else null end) j, 

COUNT(distinct case vote when 'R' then id else null end) r 

from vote 

group by convert(char(8),regdate,112) 

) a 


-- where+group by 

Select 

(select SUM(j) 

from ( 

select COUNT(distinct id) J 

from vote 

where convert(varchar(8),regdate,112) >= '20130130' and vote='J' 

group by convert(varchar(8),regdate,112) 

) A) JJ 

(select SUM(R) 

from (

select COUNT(distinct id) R 

from vote 

where convert(varchar(8),regdate,112) >= '20130130' and vote='R' 

group by convert(varchar(8),regdate,112) 

) B ) RR 


mssql2005 사용 중 - 메모리 3기가, 2년 전에 3백만원 정도 준 저가 서버 

위 두 쿼리에서 속도 차이가 나는 것을 확인했음 

장황하게 길게 쓴 아래 쿼리가 더 빠름. (위 쿼리 평균 2초, 아래 쿼리 평균 1초) 

100만여건의 투표 테이블에서 실 투표는 3천여건인 상황임. (중복 투표 허용으로 어마어마한 중복이 있음) 


다른 경우에도 case 보다 where가 더 빠른지는 확인하지 않았음 

두 쿼리를 동시에 실행해서 점유율을 보니 위 쿼리가 43%, 아래 쿼리가 57%가 나오는데 여전히 위 쿼리가 느림 ㅋ


IO를 살펴 보니...

case일 때는 null이 나오는 부분이라도 일단 읽어야 하기 때문에 더 많은 읽기 동작이 일어나는 듯.


위 쿼리

테이블 'Worktable'. 검색 수 0, 논리적 읽기 수 0, 물리적 읽기 수 0, 미리 읽기 수 0, LOB 논리적 읽기 수 0, LOB 물리적 읽기 수 0, LOB 미리 읽기 수 0.

테이블 'vote'. 검색 수 10, 논리적 읽기 수 8662, 물리적 읽기 수 0, 미리 읽기 수 0, LOB 논리적 읽기 수 0, LOB 물리적 읽기 수 0, LOB 미리 읽기 수 0.


아래 쿼리

테이블 'vote'. 검색 수 10, 논리적 읽기 수 4710, 물리적 읽기 수 0, 미리 읽기 수 0, LOB 논리적 읽기 수 0, LOB 물리적 읽기 수 0, LOB 미리 읽기 수 0.

테이블 'Worktable'. 검색 수 0, 논리적 읽기 수 0, 물리적 읽기 수 0, 미리 읽기 수 0, LOB 논리적 읽기 수 0, LOB 물리적 읽기 수 0, LOB 미리 읽기 수 0.



추가로... 

위 쿼리에서 날짜 조건(where)을 추가하면 5배 더 느려짐. 

select 

sum(j), 

sum(r) 

from ( 

select 

COUNT(distinct case vote when 'J' then id else null end) j, 

COUNT(distinct case vote when 'R' then id else null end) r 

from vote 

                where convert(char(8),regdate,112) >= '20130130' 

group by convert(char(8),regdate,112) 

) a 


이 건은 아래 참조 


중복제거와 조건이 함께 하면 느려진다. 

http://www.phpschool.com/link/tipntech/73316 


group by와 distinct를 함께 쓸 때 속도 향상법 

http://www.phpschool.com/link/tipntech/73316