-- 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
'쓸만한 주저리' 카테고리의 다른 글
페이스북 앱(페이지탭) 만들 때 황당한 일 (0) | 2013.03.28 |
---|---|
파일이 생성된 날짜별로 구분해서 하위 폴더에 정리하는 vbs (0) | 2013.03.08 |
mssql에서 group_concat 구현하기 - 예제 (0) | 2012.09.20 |
페이스북에 사진 올리기 + 유튜브 공유하기 (0) | 2012.06.20 |
[asp] imagemagick 사용법 - 바탕 그림에 글자 쓰기 (0) | 2011.11.25 |