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 6207 게시물 읽기
No. 6207
데이타 하루 250만건 처리
작성자
전해자
작성일
2005-07-06 21:58
조회수
3,058

로그 데이타를 하루에 INSERT를 250만건 정도합니다.

이렇게 싸이면 한달이면 정말로 대단하죠.

 

검색도 날짜/시간별로 검색을하고, 몇몇 조건별로 검색을합니다.

데이블 정보는 아래와 같습니다.

물론 몇몇 조건에따라 인덱싱을 7개정도 더 걸어주었구요.

검색이 너무 느려서 MySQL로 바꾸면 어쩔런가..하고 생각도하고요.

INSERT는 괜찮은데 검색이 너무 느려서 고민입니다.

무슨 여러가지 좋은 방법이있을까요?

사용 버전은 8.0.1과 8.0.3입니다.

 

검색을 좀더 상세하게적으면 아래와 같습니다.

시간 + test4

date + test5

 

하나더...vacuumdb -f 로 로그 최적화를 시키면 로그 저장을 못하고 멈추어버리는군요.

해결방법이 있을까요?

 

test=# \d logs;
"public.logs" 테이블
필드명 | 형태 | 기타 조건
-------------+------------------------+-----------
date | character varying(10) |
hour | character varying(4) |
time | character varying(10) |
status | character varying(12) |
test1 | character varying(16) |
test2 | character varying(100) |
test3 | character varying(100) |
test4 | character varying(600) |
test5 | character varying(2) |
test6 | character varying(50) |
test7 | character varying(100) |
test8 | character varying(50) |
test9 | character varying(100) |
test10 | character varying(32) |
test11 | character varying(50) |
test12 | numeric(10,1) |
test13 | character(1) |
test14 | character varying(10) |
test15 | character varying(100) |
인덱스들:
"logs_idx" btree (date, "hour")

test=#

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

인덱스를 어떤 컬럼에 걸었는지.. 그리고 구체적인 검색 SQL문은 무엇인지 알려주셔야 구체적으로 알 수 있을 것 같네요.

그리고 explain 결과를 알려주시면 더욱 좋구요.

 

그리고 vacuum -f는 서비스 중에는 하면 안됩니다. vacuum -z를 하세요.

-f 옵션은 서비스를 내리고 돌려야 합니다.

 

그리고 mysql이랑 비교했을 때에 pgsql이 검색은 그렇게 느리지 않습니다. insert는 많이 느리구요. 시험 삼아서 mysql에서도 같은 작업을 해보시는 것도 좋겠지만 검색 속도가 느려서라면 큰 차이는 없지 않을까 생각합니다.

 

그리고 개인적인 판단에는 단순히 다량의 로그를 쌓아 두고 단순한 질의만 하는 것이라면 MySQL이 더 적절할 것 같습니다. 트렌젝션도 필요 없고... 다중 join의 다중 질의도 필요 없다면... 오직 속도가 중요하다면 MySQL도 좋은 선택이라고 생각합니다. 동시 사용자가 많아지고 쿼리가 조금만 복잡해지면 성능이 급격하게 떨어지지만 말입니다.

 

물론 log만 쌓아두는 목적이 아닌 다른 용도도 포함된다면 pgsql이겠지요.

박성철(gyumee)님이 2005-07-07 01:11에 작성한 댓글입니다.
이 댓글은 2005-07-07 02:47에 마지막으로 수정되었습니다.

vacuum full 을 하면 멈춘것처럼 보이는게 아닐까요?

vacuum이 끝날 때까지 다른 질의가 모두 기다리게 되버리니까..

 

7가지가 넘는 인덱스의 모든 정보도 알아야 겠는데요 -.-;

근데 그냥 딱 보니 테이블이 좀...

date 라는 필드는 그냥 date 타입으로 맹거줘도 되지 않나 싶네요.. 4바이트와 10바이트는 =_=;;

아니면 date+hour+time 을 timestamp 로 해도 되구요.. 시간으로 검색하려면 시간만 뽑아서 따로 인덱스를 잡아도 되구요..

테이블 구조를 많이 바꾸면 훨씬 좋은 방법이 나올것 같습니다.

 

신기배(소타)님이 2005-07-07 02:31에 작성한 댓글입니다.

신기배님.. 역시... 이 늦은(또는 이른? ^^) 시간에 보면서도 테이블 구조를 자세히 보셨네요. 대단하십니다.

저는 눈에 전혀 안들어 오네요... 가물 가물... 안녕히 주무세요.

박성철(gyumee)님이 2005-07-07 02:48에 작성한 댓글입니다.

인덱싱은 한 20개정도 되는군요. 넘 많은가..하지만 다 필요한 항목입니다.

_date, time, hour를 나눈것은 별도로 검색을하는 부분이있기 때문이구요.

이것을 합치면 웹에서 분리해야하기땜시. 더 느릴거 같아서요.

보시다시피 log를 저장하는 테이블이라. 아주 단순합니다.

vacuum -f를 하여 멈추어보인다면..음..

자료가 많아서 시간이 엄청 걸리는데.. vacuum -f가 끝난다음에 insert가 정상적으로 이루어질까 의문이군요.

 

인터넷으로 찾아보니까. 역색인을 걸면 빠르다고하는데. 어떻게하는것인지..

아래처럼 인덱싱하나 걸고 질의할적에 만 아래와같이 사용하면 되는것인쥐.....

이렇게 해서는 별 성능의 이점이 없던데...

고민이 많군요. 하루에 300만 이상의 자료를 한달정도 보관해야하는데...

도움될 조언을 부탁합니다.

 

SELECT /*+ INDEX_DESC (logs logs_idx) */ count(*) FROM log WHERE
test5 = 'domain.com';

CREATE INDEX logs_idx_1 ON log USING btree (_date);
CREATE INDEX logs_idx_2 ON log USING btree (_date, test3);
CREATE INDEX logs_idx_3 ON log USING btree (_date, test6);
CREATE INDEX logs_idx_4 ON log USING btree (_date, test7);
CREATE INDEX logs_idx_5 ON log USING btree (_date, test10);
CREATE INDEX logs_idx_6 ON log USING btree (_date, test9);
CREATE INDEX logs_idx_7 ON log USING btree (_date, test3, test5);
CREATE INDEX logs_idx_8 ON log USING btree (_date, test4, test5);
CREATE INDEX logs_idx_9 ON log USING btree (_date, test6, test5);
CREATE INDEX logs_idx_10 ON log USING btree (_date, test5, test7);
CREATE INDEX logs_idx_11 ON log USING btree (_date, "hour");
CREATE INDEX logs_idx_12 ON log USING btree (_date, "hour", test10);
CREATE INDEX logs_idx_13 ON log USING btree (_date, "hour", test11);
CREATE INDEX logs_idx_14 ON log USING btree (_date, "hour", test13);
CREATE INDEX logs_idx_15 ON log USING btree (_date, "hour", test10);
CREATE INDEX logs_idx_16 ON log USING btree (_date, "hour", test5);
CREATE INDEX logs_idx_17 ON log USING btree (_date, "hour", test6, test7);
CREATE INDEX logs_idx_18 ON log USING btree (_date, "hour", test8, test9);
CREATE INDEX logs_idx_19 ON log USING btree (_date, "hour", test10, test11);
CREATE INDEX logs_idx_20 ON log USING btree (_date, "hour", test9, test8);

전해자님이 2005-07-07 09:33에 작성한 댓글입니다. Edit

다시 말씀 드리지만 vacuum -f는 운영 중에는 전혀 할 필요 없구요. 해서도 안 됩니다. vacuum -f와 그냥 vacuum의 차이는 필요없는 디스크 공간을 돌려받을 수 있다는 의미 외에는 없다고 보시면 되구요. delete나 update가 거의 없고 insert나 select만 있다면 (지금의 경우 그런 것 같네요) 그 효과는 더욱 미비합니다. vacuum -z를 하세요.

 

그리고 보여주신 질의는 oracle용 같네요. /*+ ... */ 와 같은 hint는 오라클에서나 되는 기능입니다.

 

그리고 인덱스가 많다고 select가 느려지지는 않습니다. 오히려 insert가 느리지요.

 

그런데 보여주신 쿼리문을 보면 조건이 test5='domain.com' 밖에 없는데요. 인덱스 중에는 쓸 수 있는게 하나도 없네요. 모두 f_date가 주 색인 컬럼이네요. 이래가지고는 full seq. scan 밖에 방법이 없어서 엄청 느려질 것 같네요..

 

create indedx logs_idx_test5 on log (test5);

 

이렇게 색인 만드시고...

 

vacuum -z

 

하신 후에 다시 해보세요.

 

박성철(gyumee)님이 2005-07-07 11:01에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
6210데이터 삭제에 관하여 [4]
가시고기
2005-07-07
2351
6209대량 테이블을 생성하면 어떤 영향이 있을까요? [2]
마이웨이
2005-07-07
2009
6208substring 에서 posix 사용하여 문자자르기 질문입니다. [4]
엔니오
2005-07-06
2617
6207데이타 하루 250만건 처리 [5]
전해자
2005-07-06
3058
6206CPU 자원을 엄청 잡아먹는 현상. [5]
송효진
2005-07-06
2984
6203한테이블의 두개의 속성이 다른 테이블을 참조하고 있을때 뷰생성 질문 [2]
박기원
2005-07-05
1566
6202VC++에서 bytea 필드에 파일 저장하려면?
이민우
2005-07-03
1788
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.024초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다