DB를 처음으로 접한게 PostgreSQL 이라서 그런지
요즘 ASP 와 VB를 하면서 SQL을 접하고 있으면서도
다들 쉽다고 하는 SQL이 왜 그리 불편한지.^^:;;
여튼 데브피아에 가서 SQL서버 팁을 읽다가
여러번 함수를 불러주는 것이 속도에 나쁘다라는 요지의 글을
읽게 되었습니다.. (substring 같은거 말이죠..^^)
그래서 다음과 같은 2개의 쿼리를 예를 들면서 설명을 해 놓았더군요..
(2개의 쿼리는 제가 postgresql 에서 실험을 해보기 위해서
SQL에서 convert를 이용해서 형변환을 한 것을 수정한 정도의
차이 밖에 없는 postgresql 쿼리문입니다.^^;;)
create table saledetails (
itemcode nchar(5) not null ,
saledate datetime not null ,
salecount int not null )
-- 1번 쿼리
select itemcode,
sum(case substring(saledate :: text, 1, 7) when '1999-01' then salecount end),
sum(case substring(saledate :: text, 1, 7) when '1999-02' then salecount end),
sum(case substring(saledate :: text, 1, 7) when '1999-03' then salecount end),
sum(case substring(saledate :: text, 1, 7) when '1999-04' then salecount end),
sum(case substring(saledate :: text, 1, 7) when '1999-05' then salecount end),
sum(case substring(saledate :: text, 1, 7) when '1999-06' then salecount end),
sum(case substring(saledate :: text, 1, 7) when '1999-07' then salecount end),
sum(case substring(saledate :: text, 1, 7) when '1999-08' then salecount end),
sum(case substring(saledate :: text, 1, 7) when '1999-09' then salecount end),
sum(case substring(saledate :: text, 1, 7) when '1999-10' then salecount end),
sum(case substring(saledate :: text, 1, 7) when '1999-11' then salecount end),
sum(case substring(saledate :: text, 1, 7) when '1999-12' then salecount end)
from saledetails
group by itemcode ;
-- 2번 쿼리
select itemcode,
sum(case saledate when '1999-01' then salecount end),
sum(case saledate when '1999-02' then salecount end),
sum(case saledate when '1999-03' then salecount end),
sum(case saledate when '1999-04' then salecount end),
sum(case saledate when '1999-05' then salecount end),
sum(case saledate when '1999-06' then salecount end),
sum(case saledate when '1999-07' then salecount end),
sum(case saledate when '1999-08' then salecount end),
sum(case saledate when '1999-09' then salecount end),
sum(case saledate when '1999-10' then salecount end),
sum(case saledate when '1999-11' then salecount end),
sum(case saledate when '1999-12' then salecount end)
from (select itemcode, substring(saledate :: text, 1, 7) as saledate,
salecount from saledetails) as saledetails
group by itemcode
---------------------------------------
분명히 자료의 수가 많게 된다면 1번의 쿼리에서 substring을 더 많이
해주는 관계로 속도 저하가 심할거라고 적어놓았더라구요..
뭐.. 저두 그렇게 생각하구요..
그래서 간단하게 php 로 붙어서 잠시 코딩을 해서 시간을 재어보았습니다.
(펜166 , 램32 정도의 허접한 시스템이라서 많은 자료를 해볼수 없었습니다..^^)
500개의 정도의 자료는 차이가 나지 않더군요..
그래서 5000개를 넣었습니다... 역시 차이가 나지 않는듯 했습니다.
(약 1.6초가 걸렸던가??? 기록하지 않아서..)
그래서 많은 자료를 해보려구..
37000개 정도의 자료를 넣은 다음에..(임의로 넣었습니다.)
실험을 하니까.. 역시.. 별반 차이가 나지 않았습니다..ㅡ.ㅡ;;
(1번 쿼리 : 46.38초 //// 2번 쿼리 : 46.11초)
음.. 왜 이런거져???
혹시 자료의 양이 너무 작았던건가여??
|