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 6699 게시물 읽기
No. 6699
아랫글에 대한 보충 설명 붙였습니다.
작성자
DB초보
작성일
2006-05-24 10:16
조회수
3,135

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

select id, count(date) as cnt from t2006 group by id

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

Aggregate (cost=2456925.41..2504597.16 rows=635623 width=76)
-> Group (cost=2456925.41..2488706.58 rows=6356233 width=76)
-> Sort (cost=2456925.41..2472816.00 rows=6356233 width=76)
Sort Key: id
-> Seq Scan on t2006 (cost=0.00..194859.33 rows=6356233 width=76)
---------------------------------------------------------------------------------------------------------------------------------------------------
id : character varying(100)
date : timestamp with time zone

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

t2006 테이블의 데이타 갯수 : 6,356,233

---------------------------------------------------------------------------------------------------------------------------------------------------
날짜 조건을 뺐습니다..
속도를 줄일려면 어떻게 하면 좋을까요?


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

date 가 timestamp 이구요.. 그중에 월 단위로 id로 group by 하고 싶으시단 거죠?

 

nonun=# CREATE TABLE test(id varchar(100), date timestamp);

CREATE TABLE

nonun=# INSERT INTO test VALUES ('aaa', now());

INSERT 0 1

nonun=# SELECT * from test ;

id      |  date

-----+----------------------------

aaa   |  2006-05-24 16:57:47.945679

(1 row)

nonun=# CREATE INDEX index_test_date ON test ((date_trunc('month', date)::date));

CREATE INDEX

nonun=# \d test

Table "public.test"

Column  | Type                                      | Modifiers

--------+-----------------------------+-----------

id          | character varying(100)             | date | timestamp without time zone |

Indexes:

"index_test_date" btree ((date_trunc('month'::text, date)::date))

 

nonun=# EXPLAIN SELECT date_trunc('month', date)::date from test where date_trunc('month', date)::date='2006-05-01'::date;

QUERY PLAN

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

Index Scan using index_test_date on test (cost=0.00..4.69 rows=1 width=8)

  Index Cond: ((date_trunc('month'::text, date))::date = '2006-05-01'::date)

(2 rows)

 

이렇게 인덱스를 만드시면 되겠습니다. 인덱스 잘 타네요~ 검색하실 때는 위의 쿼리처럼 뒤에 '2006-05-01' 부분만 어플리케이션에서 바꿔주시면 되겠습니다.

신기배(소타)님이 2006-05-24 17:05에 작성한 댓글입니다.
이 댓글은 2006-05-24 18:38에 마지막으로 수정되었습니다.

문제는 ID로 group하여 count를 하면 속도가 느리다는 겁니다..

ㅠ_ㅠ

날짜로 조건 걸었을 때랑 안걸었을 때랑 별 차이 없거든요..

정말 속도 개선할 수 있는 방법이 없는 걸까요;;;

 

DB초보님이 2006-05-25 10:10에 작성한 댓글입니다. Edit

음.. 하기 인덱스를 건다고 해서 항상 빨라지는건 아닙니다. 데이터의 분포가 중요합니다.

어렇게 인덱스를 거시고 나서 vacuum analyze 해보셨나요? 아니면 vacuum full 을 한번 해보시는 것도 도움이 됩니다.

 

인덱스를

CREATE INDEX index_test_date ON test ((date_trunc('month', date)::date), id);

로 걸어보세요. 성능이 향상될 수도 있습니다. 역시 인덱스 거시고 위의 작업을 한번 해봐주세요.

그리고 쿼리문에서 count(id) 가 아니라 count(*) 로도 한번 바꿔보시고요. 별 차이 없을것 같지만;;

 

잘 되시면 explain analyze SELECT .... 의 결과를 한번 올려봐 주세요

 

ps. 아; 날자별로 검색할 필요가 없다면 그냥 id 컬럼에 인덱스만 걸어보세요.

신기배(소타)님이 2006-05-25 18:30에 작성한 댓글입니다.
이 댓글은 2006-05-25 18:31에 마지막으로 수정되었습니다.

으악. 함수 결과를 인덱스로 잡는 다는 것이

바로 이 말씀이셨군요.

 

CREATE INDEX index_test_date ON test ((date_trunc('month', date)::date));

 

다시 한번 pgsql에 홀딱 반하는 군요. *.*

 

고맙습니다. 신기배님

 

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