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 7581 게시물 읽기
No. 7581
검색을 할려고 하는대 너무 느려서 질문드립니다.
작성자
나윤성(앨버른)
작성일
2008-12-30 11:37ⓒ
2008-12-30 15:22ⓜ
조회수
6,465

현재 재가 검색할려는 

CREATE TABLE tb_item

(

  server_id smallint,

  account_id character varying(20),

  char_name character varying(20),

  action_id smallint,

  item_id integer,

  item_serial bigint,

  money integer,

  item_cnt integer,

  where_root character varying(20),

  ndate bigint,

  havemoney bigint,

  upgradelevel smallint,

  upgradeability integer,

  enchantability character varying(255)


이런 테이블의

Table의 Row수는 : 173171000 수입니다.


테이블 컬럼의 인덱스는


ndate에 클러스트 인덱스를


char_name에 인덱스를 걸어놓았습니다.


그런다음 


select ahourdate from (select * from tb_item where ndate > 20081229010000 and ndate < 20081290200000) as ahourdate where ahourdate.char_name = '___' limit 30;


이런 쿼리를 날리는대 상당히 오랜 시간이 걸립니다.


게다가 이것이 로그 테이블이라서 실시간적으로 쌓이는 데이터 량도 상당히 많고 저런 조건 쿼리를 날려서 확인을 해야되는 상황입니다.


게다가 


select count(*)를 할시에 위에있는 쿼리보다 오랜 시간이 걸리더군요.


이렇게 검색속도 향상을 위해서 어떻게 해야 될까요 ;



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

ndate 자료형을 timestamp 값으로 바꾸고,


인덱스를 ndate와, char_name 칼럼 두개를 함께 걸고,


select ahourdate from tb_item where ndate > '2008-12-29 01:00:00'::timestamp without time zone and ndate < '2008-12-29 02:00:00'::timestamp without time zone and char_name = 'MGHOLIC03' order by ndate desc limit 30;


이런식이면 인덱스를 사용하면서 빠르게 처리하지 않을까싶습니다.


일단 bigint 자료형이고, 저렇게 자료가 많은 경우라면, 쿼리최적화기가 그 범위를 보고 인덱스를 쓸 것인가 말 것인가를 결정할 것 같네요 (제가 최적화기를 만든다면 그렇게 할듯) 만일 이 가정이 맞다면 범위가 너무 커져서 인덱스 사용을 하지 않을 가능성이 큽니다.


게다가 inline view 를 쓰게 되면 그 view의 쿼리 결과에 대한 인덱스 또한 사용이 불가능합니다. 인덱스를 쓸 수가 없으니.


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


count(*) 문제는 따로 고민해보셔야합니다. 저렇게 자료가 많은데, row count를 찾아내야할 상황이면 집계테이블이 하나 존재해야할 것 같네요.


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


이것보다 가장 크게 고민하셔야하는 부분,

자료가 많이 쌓일 때, 그 자료의 인덱스에 대한 크기 또한 고민의 대상이 되어야합니다.

저 상태에서 2억 ~ 3억으로 계속 관리를 하고 싶다면,

인덱스 분활도 생각해 보셔야합니다.

그렇지 않으면 로그 insert 작업에서 갑자기 속도가 떨어질 것이 예상됩니다.


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


멋지게 풀어보시고, 잘 풀렸으면 그 노하우를 이곳에 전수해 주시길.

김상기(ioseph)님이 2008-12-30 12:26에 작성한 댓글입니다.

제글은 아니지만 김상기님 답변 정말 깔끔하고 시원하네영

배우고 갑니다 감사합니다.

열혈지누(jinukey)님이 2008-12-31 10:59에 작성한 댓글입니다.

답변감사합니다. 
새로 timestamp 컬럼을 만들거나
집계테이블등 많이 고민을 해봐야겠네요 !

나윤성(앨버른)님이 2009-01-07 11:16에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
7584텍스트 파일에 있는 테이블 [3]
궁금이
2009-01-05
6447
7583- [3]
압피
2009-01-04
6337
7582- [2]
압피
2008-12-31
6591
7581검색을 할려고 하는대 너무 느려서 질문드립니다. [3]
나윤성
2008-12-30
6465
7580합계를 내려고 하는데 잘 안돼서 질문 드립니다. [4]
2008-12-23
6937
7579EUC_KR을 Postgresql에 처음 적용 시키신 분을 찾고 있습니다. [2]
박춘삼
2008-12-23
6647
7578하루에 한번씩 테이블을 생성하려고합니다. [3]
김종석
2008-12-19
6283
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다