database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Q&A 4438 게시물 읽기
No. 4438
왜 속도 변화가 없는 걸까여??
작성자
김말똥(effacer)
작성일
2002-11-14 17:30
조회수
3,485

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초)

 

음.. 왜 이런거져???

혹시 자료의 양이 너무 작았던건가여??

이 글에 대한 댓글이 총 3건 있습니다.

웁스....

 

오늘 10만건에 대해서 해보니..

오히려 1번 쿼리(129.69초)가 2번 쿼리(132.39초)보다

속도가 잘 나오는군여..ㅡ.ㅡ;;;

 

서버에 램이 너무 작아서 이상한 결과가 나오는 것인가 모르겠군여..ㅡ.ㅜ;;;

김말똥(effacer)님이 2002-11-15 10:54에 작성한 댓글입니다.

substring() 함수는 C 코딩하는 사람이라면 다 알겠지만, 늦게 작동되어야 (메모리를 많이 쓴다거나, CPU를 많이 쓴다거나) 이유가 전혀 없는 함수 입니다.

 

응용프로그래머가 DB 쿼리를 할 때 중요한 것은

그 쿼리에서 함수를 사용하는가 안하는가가 아니라, 그 쿼리가 인덱스를 사용하는가 안하는가입니다.

 

정말로 중요한 사실입니다.

 

예제로 든 쿼리에서 10만건 이상되는 자료가 있을 때, 인덱스를 사용한다면, 1초 미만에 끝날 수 있는 것을 사용하지 않는다면, 10초 이상 걸리는 사태를 발생할 수도 있거든요.

ioseph님이 2002-11-15 16:49에 작성한 댓글입니다.

정말로 1번 쿼리가 시간이 적게 든다고 나와있습니까?

 

상식적으로 2번 쿼리가 시간이 더 많이 들어야 하는데...

 

왜냐하면, 1번이나 2번 모두 테이블의 모든 Row에 대해서 substring 함수를 실행하게 됩니다. 그 이유는 아시죠?

 

그러나 2번의 경우, 임시 테이블을 만들지 않는다면 얻어진 각 Row를 파이프라인으로 연결하여 다음 쿼리로 전달합니다(중첩 쿼리이므로).

 

1번 쿼리는 각 Row를 실행하여 바로 Output을 내지만...

 

정확하게 시간 테스트를 하시려면, 1번 후 바로 2번을 실행하지 마세요. 1번에서 사용한 테이블이 메모리에 올라와 있으면, 2번 쿼리가 더 빨리 처리될 수 있습니다.

 

저도 테스트 결과가 궁금해지는군요.

김동아(love89)님이 2002-11-18 01:34에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
4441check에서 다른 테이블의 필드값을 참조할 수 있는가요. [1]
김일권
2002-11-19
849
4440postgresql을 사용하기위한 python 모듈을 어디서 구할 수있나요 [2]
dasida
2002-11-18
807
4439혹시 postgres와 java로 컨넥션풀링해보신분 자료좀.. [1]
박기원
2002-11-18
923
4438왜 속도 변화가 없는 걸까여?? [3]
김말똥
2002-11-14
3485
4437여러분은 sequence를 어케 사용하세여? [1]
박기원
2002-11-14
1104
4436delete시 외래키 문제 (왕초보 도와주세요~) [1]
김미경
2002-11-14
1022
4435데이터의 양이 줄어드는지 체크하는데요.. [1]
이상학
2002-11-14
770
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.020초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다