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 4764 게시물 읽기
No. 4764
select count(*) 의 속도 문제
작성자
김한성(kublaikhans)
작성일
2003-06-23 12:09
조회수
4,194

현재 100만건을 목표로 랜덤 자료를 생성하고 있습니다.

16만건 정도 생성해서 이것 저것 테스트해보니 문제가 좀 생겼습니다.

 

CREATE TABLE RANDOM_TEMPLATE

(

RAN_SEQ INTEGER NOT NULL,

RAN_VARIABLE CHAR(18) NOT NULL,

RANS_LAST_USE CHAR(1) DEFAULT ''

);

 

ALTER TABLE RANDOM_TEMPLATE ADD CONSTRAINT PK1_RANDOM_TEMPLATE UNIQUE (RAN_SEQ);

ALTER TABLE RANDOM_TEMPLATE ADD CONSTRAINT PK2_RANDOM_TEMPLATE UNIQUE (RAN_VARIABLE);

 

이 테이블에 자료를 생성하고 지금 집어 넣고 있는데, 이상하게도 count(*) 속도가 너무 느리다는 겁니다.

select count(ran_seq) from random_template 해도 마찬가지구요.

이상한 건 index 를 제거한 다음에 해보아도 속도가 비슷하게 나온다는 겁니다.

다시말해, index 를 걸고 select count(ran_seq) from .. 해도 속도가 안 건 거랑 별반 차이가 나지 않습니다.

 

하지만 select * from random_template where ran_variable = 'xxxxx' 하면 인덱스를 안 걸었을 때는 제 서버에서(펜티엄 제온 1.8G 듀얼) 약 30초, 걸었을 때는 순간입니다.

 

종합해 보면 인덱스 생성은 제대로 된 것 같은데, 이상하게 count(*) 명령이 늦네요.

 

확실하진 않지만 다른 DB 에서는 안 그랬던 것 같아서요.

 

해결책을 아시는 분 있으면 알려주시면 감사하겠습니다.

 

참고로 postgresql 버전은 7.3.2 입니다.

 

--- khans

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

PostgreSQL의 가장 치명적인 단점이라고 감히 말합니다. :)

 

PostgreSQL에서는 대용량 수십만건 이상 되는 데이터에서 select count(*) from table 명령은 무지막지하게 느립니다. 단순이 카타로그에서 가져오기만 하면 될터인데, 왜 그리 느리진 저도 모르겠습니다.

 

아무튼 이 문제는 당분간 해결이 나지 않을 문제가 같습니다.

 

일단 이 문제는 현재상태에서 그나마 속도를 올릴 수 있는 방법으로는 vacuum 명령으로 데이터를 물리적 상태를 최적화 시키는 방법과 하드웨어 업그레이드 뿐인 것으로 알고 있습니다.

 

자세한 이야기는 이곳 게시판에서 '대용량'으로 검색해 보시면 몇가지 힌트될만한 글들을 발견하실 수도 있을겝니다.

김상기(ioseph)님이 2003-06-23 13:25에 작성한 댓글입니다.

저같은 경우는 시리얼을 사용해서 카운트의 속도 문제를 어느정도 해결봤습니다.

 

예를들어

 

create table t1 (

f1 serial,

f2 text

);

 

그리고 인덱스를 f1 에 생성시켰습니다.

그후에 count(*) 대신 다음과 같은 쿼리를 사용했습니다.

 

SELECT f1 from t1 order by f1 desc limit 1;

 

f1 을 시리얼로 정의했기때문에 위에 쿼리가 count(*) 대신으로 사용가능 합니다..

초보임니다님이 2003-06-24 03:36에 작성한 댓글입니다.

시리얼 형의 마지막 값을 전체 테이블의 row 갯수 일 것이다는 생각은

 

다음 조건이 모두 만족되어야합니다.

 

1. 자료 insert 할때, 한번도 insert 오류를 내지 않았는 것과

2. 그 serial 컬럼의 값을 다른 값으로 한번도 update 하지 않았는 것과

3. 그 테이블의 자료를 한번도 삭제하지 않았다는 것.

 

즉, 일반적인 테이블에서 제일 큰 시리얼값은 테이블 전체 row 갯수다는 것은 거의 불가능합니다.

김상기(ioseph)님이 2003-06-24 09:31에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
4768[질문]pl/pgsql 관련 질문입니다. [4]
이승용
2003-06-24
1750
4766[샘] 테이블을 나눌지 말지... [2]
임유빈
2003-06-24
1436
4765제발도와주세요..흐흐흐
김기영
2003-06-23
1399
4764select count(*) 의 속도 문제 [3]
김한성
2003-06-23
4194
4767┕>답변 감사합니다.
김한성
2003-06-24 10:35:51
1487
4763해당 주의 시작날짜를 알고 싶습니다. [1]
이승배
2003-06-20
1828
4761자료입력문제 [1]
길동무
2003-06-19
1239
4760로우레벨 락에 대해서.. [1]
초본데염
2003-06-18
2031
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.022초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다