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 7475 게시물 읽기
No. 7475
count(*) 의 성능은?
작성자
산하
작성일
2008-07-29 14:04
조회수
6,993

게시판 시스템인데 테이블의 전체 row 수를 필요로 하는 경우가 종종 있습니다.

그래서 일단은 데이터 모델에서 count 컬럼을 두어 글이 추가될때 카운팅 해놓게 하고는 그것을 참조하긴 하는데요.

이렇게 하면 글이 쓰지거나 지워질때 카운트 올리는 부분도 꼭 있어야 하고..

그 루틴 외의 부분에서글이 추가되거나 지워지면 (이를테면 직접 db shell에서 뭔가 한다던지) 여기 반영이 안됩니다.

신경안쓰고, 제일 정확하게 하는것은 실제 count 로 값을 받아오는것일텐데요.

이것이 거의 성능에 문제가 없다면? (이를테면 DB에서 이미 pk 의 row수를 갖고 있어서 돌려준다던지) 그렇게 수정을 할려고 합니다.


아래와 같이 query plan을 보았는데 잘 볼줄을 몰라서 알수가 없네요.

따로 count 컬럼을 안 두고 그냥 매번 count(*) 혹은 count(id) 해도 될련지요?



testdb=> explain analyze

testdb-> select count(*) from forums_label;

                                                   QUERY PLAN

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

 Aggregate  (cost=12.13..12.13 rows=1 width=0) (actual time=0.070..0.071 rows=1 loops=1)

   ->  Seq Scan on forums_label  (cost=0.00..11.70 rows=170 width=0) (actual time=0.011..0.043 rows=15 loops=1)

 Total runtime: 0.124 m

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

count(*) 보다는 count(컬럼)이 성능이 좋습니다.

그리고 count보다는 트리거를 써서 통계테이블을 사용해서 하는게 설계는 조금 귀잖더라도

성능향상에는 무진장 좋습니다.

그럼

김병석(byung82)님이 2008-07-29 14:10에 작성한 댓글입니다.

윗분 말씀처럼 트리거 쓰면 됩니다. 근데 전 귀찮아서 보통 count(*) 해버립니다.

홍민희(dahlia)님이 2008-07-31 14:05에 작성한 댓글입니다.

만약 자바를 이용하고 계시다면...

ResultSet.last();

ResultSet.getRow();

하면 전체 로우수를 가져올 수있습니다.

그리고 다시

ResultSet.absolute(위치);

하시면 원하는 위치로 갈 수 있습니다.

이재학님이 2008-07-31 17:43에 작성한 댓글입니다. Edit

query plan에서 보여준 것 처럼 count(*)는 직접 seq scan으로 일일이 갯수를 세기 때문에 느릴 수 있습니다(몇백만건 들어있는 DB.. 쬐끔 느리더군요.. 2번째는 좀 빠르고..)


테이블에 row 카운터를 추가해서 count(*) 성능을 향상시킬거라는 소리가 있었는데... 들어갔는지는 모르겠군요..

최정대(whitekid)님이 2008-08-19 10:13에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
7482테이블 컬럼을 변경했을시에 나는에러.
나윤성
2008-08-04
6302
7480증분 백업에 대해
레전드
2008-08-02
6717
7478인덱스 관련 질문(WHERE조건이 많을 경우)... [4]
오래된남자
2008-07-29
8321
7475count(*) 의 성능은? [4]
산하
2008-07-29
6993
7474날짜가 중복이 안되게 등록하려고 하는데요 [1]
만수
2008-07-28
7134
7473SELECT 시에 인덱스를 강제로 지정하는 방법이 있나요? [2]
오래된남자
2008-07-28
6935
7472join 을 이용해서 id 걸러낼때. [2]
산하
2008-07-28
7041
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다