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 4824 게시물 읽기
No. 4824
PostgreSQL 속도 향상을 위한 방법을 알려주세요
작성자
신기배(nonun)
작성일
2003-08-06 10:59
조회수
10,369

안녕하세요 :)

 

최근에 회사에서 일부 기능 부터 PostgreSQL로 옮겨 가자는 말이 나와 검토 되던중.. MySQL 과의 속도 싸움에서 너무나 참담하게 깨졌습니다.

 

하드웨어는 PostgreSQL도 충분히 빠를거 같은(?) 사양입니다.

P4 제온 2.4기가 듀얼(하이퍼 쓰레딩으로 쿼드), 1기가였나? -.-; 2기가 램 이었던거 같습니다. mysql은 3.23.52 (쿼리캐쉬 없음), postgresql은 7.2.3 입니다.

 

일단 5백만건의 준비된 데이터를 집어 넣는데

mysql은 덤프 파일을 입력하고 pgsql은 \i 를 이용해 입력 받았습니다. fsync 는 off 해놓구요.

뭐 여기서는 약 2배의 속도 차이밖!!에 나지 않았습니다 -_-;

 

스트레스 줘본다고 비슷한 사양의 리모트 서버에서 16~32개의 프로세스가 약간씩은 비슷한 쿼리(조건이 여러가지인)를 계속 날리게 했습니다.

mysql은 초당 평균 1500개의 쿼리를 처리했고

pgsql은 초당 1~200개의 쿼리를 처리했습니다.

 

둘 다 특별한 튜닝이나 설정(fsync=off 빼구여)이 없는 상태였습니다.

이런 결과가 나오고 나니까 -_-; pgsql엔 업데이트만 하고 업데이트 될때 트리거나 룰을 이용해 mysql로 리플리케이션 하듯이 해서 mysql에서는 검색만 하자는둥.. 별 얘기를 다 했습니다 =_=

 

사실 버퍼나 접속을 늘려준다는 정도 말고는 특별히 pgsql에 대해 튜닝을 할만한 뭔가가.. 부족한 듯 싶습니다.

select에서 mysql의 절반정도만 나와도 사실 성공했다고 생각합니다 -.- 분명 다른 무언가를 얻을수 있는 DBMS니까여

속도를 향상하기 위한 방법이나 설정파일이 있으면 알려주세요~

그럼.. ^^;

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

어떤 식으로 table을 만드셨는지 궁금하네요.

인덱스는 적절했는지...

일단 인덱스를 점검해 주시구요.

data를 입력한 다음에 vacuum을 한번 해주시구요.

속편하게 vacuum full해서 전체를 정리하는 것이 좋을 것 같네요.

그리고 쿼리문의 비용 계산을 한번 해보세요. explain 명령으로요...

하지만 확실한 것은 단순한 구조에서는 mysql이 속도가 훨신 빠르다는거죠. 트렌젝션도 없고 포린키도 없고...

좀 더 자세한 정보를 보여주시면 여러 고수님들이 도와드릴 수 있을 것 같네요.

박성철님이 2003-08-06 14:21에 작성한 댓글입니다.

PostgreSQL 개발자 사용자 층은 비교적 유동적이지 않아 7.3.x 대가 나왔다 함은 그 만큼 오래 쓴 사용자들의 의견이 반영되어 나온다고 보는 것이 타당합니다. 처음에는 자료구조 상속이나, 지리정보에 촛점이 맞추어지더니, 다음에는 ANSI SQL 구현 쪽으로 그리고는 요즘은 대용량에 촛점이 맞추어지더군요.

 

그 첫번째 프로젝트가 테이블스페이스의 도입이고, 그 두번째가 쿼리 캐쉬입니다.

 

테이블스페이스 개념이 도입되어야 OS 비의존적인 자료를 구축할 수 있는지라, 대용량 DB에서는 필수적입니다. 하지만, 이것이 구현되기까지는 요원합니다.

 

쿼리 캐쉬는 대용량 자료 select에서는 거의 필수적으로 인식되고 있는 개념입니다. 오라클의 SGA 공간 같은 놈이 PostgreSQL에도 구현되어야 뭘 이야기해도 할 것인데, 이놈 또한 요원합니다. MySQL 쪽에서는 4.x 대로 바뀌면서 드디어 아주 기초적이나마 쿼리 캐쉬 기능을 지원하기 시작하더군요.

 

즉, 현재 상태로 본다면, 대용량 자료에 대한 RDBMS로 PostgreSQL 놈은 그 자격이 없는 샘이지요. 이것이 PostgreSQL 놈을 바르게 보는 견해입니다.

 

그렇다면, 현재의 PostgreSQL 이놈으로 어떻게 땜빵(!)할 것인가? 이것에 대한 이야기를 할 수 밖에 없는 것같습니다.

 

답은 간단합니다. 이곳 게시판, PostgreSQL 설명서 등에서 계속 이야기 하고 있는 지극히 단순한 개념들입니다.

 

1. 한꺼번에 많은 데이터를 테이블에 넣어야할 경우는 insert 구문 대신에 copy 구문을 이용한다.

insert 구문보다 copy 구문이 심하면 수백배 빠릅니다.

2. 사용하지도 않는 index는 만들지 않는다.

(update 구문 속도에 가장 영향을 주는 것이 index 입니다)

3. select 쿼리는 반드시 그 비용을 살펴보고 가장 빠른 쪽을 택하든지, 가장 비용이 적게 드는 쪽으로 선택한다.

4. 주기적인 vacuum으로 최적화된 데이터를 유지한다.

5. 같은 스케줄의 쿼리가 반복 된다면, prepare 구문을 이용해서 쿼리를 미리 준비해 둔다.

6. 통계관련 테이블을 적절히 이용한다. (대용량 데이터에서는 필수적이더군요)

 

제가 지금 생각나는 것은 이정도입니다.

개인적인 생각으로는 5백만건 단순 데이터(제약조건없고, foreign key 없고, 트리거 없고)를 가지고, MySQL과, PostgreSQL 비교한다면, 속도 면에서 PostgreSQL 놈이 당연히 뒤처지겠지만, 이것이 실무적인 관점에서 볼때, 업무에 지장을 초래할 만큼의 차이가 발생하리라고는 보지 않습니다.

지금까지 경험에 의하면, 백만건이 넘어가는 데이터를 가지고 실무에 사용될 때 PostgreSQL로 이용하는 것이 잃는 것 보다 얻는 것이 더 많았습니다.

실무에서 쓰이는 데이터는 단순한 자료구조가 별로 없거든요. 대부분 위에서 언급한 트리거에 의한 통계, foreign key, 제약조건들 ... 온갖 '관계에 대한 정보'들도 함께 포함되기 때문입니다.

김상기(ioseph)님이 2003-08-06 14:56에 작성한 댓글입니다.

너무 난해하게 글을 적은 모양이네여 ^^;;

데이터 입력은 copy from stdin 으로 시작되는 파일을 \i 로 입력 받은 거구용 ^^;;

pgsql의 insert 속도는 fsync 를 꺼도.. 크으 -_-;;

 

테스트의 목적은 사용자의 검색만을 담당할 DBMS를 분리 하자는데 목적을 두고 시작하였고 update나 insert가 일어날 경우에도 select에는 아무런 문제가 없어야 한다! 가 조건이었습니다.

 

당시..(약 2주일 전인데 기억이.. 퍽퍽) 9개 정도의 컬럼이 있었고 그중 2개는 char, 1개는 int, 나머지 6개는 int2 였습니다. 모든 컬럼에는 BTREE 인덱스가 독립적으로 걸려 있었습니다. 모든 쿼리는 인덱스를 사용했구요. 테스트 전에는 항상 vacuum을 실행 했습니다.

 

제가 회사안에서 pgsql을 주장 했으나.. -.- 역시 DBMS는 용도에 맞춰 선택을 하는 것이.. 필요한 것은 많은 쿼리(대부분 select)를 최대한 빨리 처리하는 것이었습니다. 회원 검색DB는 물리적으로도 완전히 독립되기 때문에 사실 -_-;;;;

 

pgsql에 대부분 만족하지만 오직.. 속도만이 흔들리게 하는군요 -_-; 속도를 높이는 비기를 알려주세욧! 크흑

신기배(nonun)님이 2003-08-06 15:27에 작성한 댓글입니다.

기본 mysql을 transaction을 지원하지 않기 때문에 단순한 구조에서는 빠르지 않을 수가 없습니다.

만약 pgsql의 고급 sql 기능들이 필요없다고 하고 속도가 중요한 factor라고 한다면 그리고 아주 단순한(말씀 하신 회원 정보) 구조라고 한다면 mysql이 더 적합할 것 같습니다.

사실 어떤 DB 전문가가 mysql은 DBMS가 아니라 고급 파일 시스템에 가깝다라고 평가한 것을 봤고 저도 몇가지 이유 때문에 Pgsql을 선호하지만 때로는 고급 파일 시스템이 더 적합한 곳도 있기 마련이지요. ^^

다만 말씀하신 것 처럼 모든 컬럼에 index가 걸려있다면 transactoin이 되는 pgsql은 더 부하가 많아지겠죠?

그리고 index는 독립적으로 따로 거는 것 보다는 여러 컬럼으로 구성된 index를 거는 것이 효과적입니다. 인텍스를 다 건다고 그걸 다 쓰지 않거든요. 가장 적당한 것을 골라 그놈 하나만 쓴다고 보시는 것이 맞을 듯 합니다. 좌우간 explain 한번 해보시죠.

table 구조랑 질의문을 공개하실 수 있으면 같이 연구해 볼 수 있을 듯합니다.

뭐... 알아서 잘 하셨겠지만 머리를 모으면 좀더 좋은 아이디어가 떠오를 수 있으니까..

박성철님이 2003-08-07 00:38에 작성한 댓글입니다.

전 단지 속도 때문에 MySql을 포기하고 PostgreSQL로 온게 아닙니다...

 

솔직히 INSERT는 MySql쪽이 빨랐지요...

이건 뭐 인텍스나 뭐 그런 것과는 하등 상관이 없는 문제니까요

 

하지만 정작 DB를 1~2년 돌리다 보니 INSERT속도는 둘째가 되고...내부적으로 통계내고 하는 면이 더 우선이 되더군요...(현재 유통회사 DB 지원중...^^;)

 

이런부분에 대해서라면 이미 MySQL쪽에 큰 기대 안하고 있습니다...차츰 나아질거라고 생각은 하지만 그걸 바라보고 일할수는 없으니까요...^^;

 

아무래도 DB마다의 특성이 있겠지요...만일 커뮤니티의 게시판 운영을 위해서라면 지금이라도 분명히 MySql 쓰겠지만

 

통상적인 회사업무를 위해서라면 속도에 대해선 크게 미련을 가지지 않고 PostgreSQL을 선택할 것입니다.

김영호(icepage)님이 2003-08-13 13:24에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
4828200만건 데이터의 PostgreSQL 성능 보고 [3]
김상기
2003-08-06
3515
4826PostgreSQL 7.3.4 가 릴리즈 되었네요... [1]
이상호
2003-08-06
1518
4825[질문]파일 import 관련 .. [1]
Jin
2003-08-06
1714
4824PostgreSQL 속도 향상을 위한 방법을 알려주세요 [5]
신기배
2003-08-06
10369
4823수십만건 이상 되는 자료에 대한 자료 목록의 표현 방식에 대한 논의 [12]
김상기
2003-08-02
7727
4822저.. 이 에러좀 봐주세요.. [1]
양진웅
2003-08-01
1624
4821postmaster가 죽질 않아요.. [2]
양진웅
2003-07-30
1508
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다