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 6698 게시물 읽기
No. 6698
속도가 ㅠ_ㅠ 빠른 방법 좀 찾아주세요.
작성자
DB초보
작성일
2006-05-23 17:08ⓒ
2006-05-23 17:23ⓜ
조회수
3,449

---------------------------------------------------------------------------------------------------------------------------------------------------

select id, count(date) as cnt from t2006 where substring(date, 1, 10)>='2006-04-01' and substring(date, 1, 10)<='2006-04-31' group by id

---------------------------------------------------------------------------------------------------------------------------------------------------통계를 내는 쿼리인데..

한달 동안 id 별로 몇번 접속했는지에 대한 count 값을 구하는 겁니다.

트리거를 써서 할 수 있지만.. 처음부터 그렇게 한게 아니라서요.. ㅠ_ㅠ

저거 저리 돌리면 상당히 느립니다..

아시다시피 sort 하는 부분에서 대부분의 시간을 잡아 먹더라고요..

 

속도를 개선하는 방법이 없을까요?

 

 

 

 

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

date 라는 필드의 데이터 타입과 해당 테이블의 인덱스 구조들, explain select ... 으로 쿼리 했을 때의 화면을 보여주세요.

그리고 2006-04 의 데이터의 갯수도 알려주세요

신기배(소타)님이 2006-05-23 18:23에 작성한 댓글입니다.

윽...

 

대용량 데이터 베이스 라는 책에도 나오고 여기 저기 나오지만..

 

치명적인 문제를 안고 있네요.

 

date 컬럼이 어떤 자료형을 가지고 있는지 모르겠지만...

컬럼값에 함수를 쓰는 것은 금물이다... 라고...

저 경우는 varchar 컬럼이라고 가정했을때

date like '2006-04%' 라고만 할 수 도 있는 것 같은데요.

 

즉 date like '2006-04%' 로 할 수 있는 문제를

substring(date, 1, 10) 으로 하는 것은 인덱스가 있다고 하더라도 인덱스를 타지 않게끔 하죠.

 

제가 보기엔 아마도 date 컬럼이 YYYYMMDDHH24MISS 로 되어있는 VARCHAR 같은데요..

 

박인서(bubux)님이 2006-05-23 23:43에 작성한 댓글입니다.
이 댓글은 2006-05-23 23:45에 마지막으로 수정되었습니다.

pgsql은 함수 결과를 인덱스로 잡을 수 있어요~

신기배(소타)님이 2006-05-24 01:18에 작성한 댓글입니다.

음.. 일단 검색 field를 date로 잡으셨으니 date field에 index가 잡혀있는지 보식요, 없으시면 index를 잡아주시기 바랍니다.

 

그리고.. substring(date, 1, 10)>='2006-04-01' and substring(date, 1, 10)<='2006-04-31 이런식으로 조건 잡으면 절대로 인덱스를 타지 않습니다.

 

만약 자료형이 varchar일경우 위에 박인서님 의견처럼 date like '2006-04%'를 이용하시는것이 효율적일거 같구요..

timestamp(또는 timestamptz등) 의 형태일경우는 BETWEEN을 이용해보세요.

 

date BETWEEN '2006-04-01 00:00:00.000000'::timestamp AND '2006-04-30 23:59:59.999999'::timestamp

 

이렇게 하시면 인덱스를 정상적으로 타는걸 보실수 있을겁니다.

한승전(dksniper)님이 2006-06-26 12:08에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
6702. [1]
김재국
2006-05-24
2961
6700pg_dump 에러 - 편집기 글씨가 깨져서 에러 내용만 올립니다. 고수님들 조언부탁 [1]
테루
2006-05-24
2885
6699아랫글에 대한 보충 설명 붙였습니다. [4]
DB초보
2006-05-24
3134
6698속도가 ㅠ_ㅠ 빠른 방법 좀 찾아주세요. [4]
DB초보
2006-05-23
3449
6697[질문]여러 Row를 한꺼번에 insert하는 방법...C 프로그램에서요 [3]
전종대
2006-05-22
3038
6696PostgreSQL upgrade [5]
Andrew
2006-05-22
2875
6691PostgreSQL 업그레이드
Andrew
2006-05-18
2724
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.016초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다