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 6408 게시물 읽기
No. 6408
1분에 4만개의 데이터를 인서트하면서...
작성자
이정호
작성일
2005-11-09 09:56ⓒ
2005-11-09 10:19ⓜ
조회수
4,503

5분에 20만개의 데이터가 들어갔다 나옵니다...

그런데 나중엔 메모리가 풀나더라고요..

postgresql은 분당 몇개의 데이터까지 커버할 수 있나요?

사양은 2.4에 512램입니다.. 5분에 20만개면 많은 것인가요?

또 저같은 경우는 insert를 사용하여 전부 집어넣고 있는데 돌아다니면서 보니 copy라는 것으로 빠르게 넣을 수 있다는데 여기에 쓰는 것이 맞는 건가요?

크기는 작으나 양이 많을 경우 좀 더 효율적인 방법이 있는지 알고 싶습니다.. 아시는분 있으면 도움 부탁드립니다.

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

설계자체에 문제가 있는게 아닐까싶네요.

 

무엇때문에 그런 방식을 택했는지를 이야기해주시면 같이 고민하면서 최적의 방안을 찾을 수 있지 않을까싶네요.

 

참으로 4만개의 자료가 처리되어야할 상황이면,

방안이 분산처리를 고려해봐야할 상황 같습니다.

이런 문제는 고사양 DB로 바꾼다고 하더라도, 단지 하나의 DB에서 모든 작업을 하겠다는 생각은 위험한 생각이거든요.

 

김상기(ioseph)님이 2005-11-09 13:36에 작성한 댓글입니다.

C언어를 사용하였구요. pcap을 이용해서 모든 패킷을 가지고 와서 패킷의 정보를 디비에 저장할려고 했습니다. 5분정도에 20만개의 패킷을 들어오더라구요.. 피씨가 많은 이유도 있겠지만.. 분산처리라고 하심은 여러디비에 분산하는 것인가요 아니면 컬름을 자세히 나누는 것을 말씀하시는 건가요.. 전 아이피 정보를 8개로 나눠서 전부 varchar로 설정했습니다. 나중에 빼쓰기 편할거 같아서요.. 조언 다시한번 부탁드립니다.

글쓴이님이 2005-11-09 14:01에 작성한 댓글입니다. Edit

그런 경우는 일반적으로 덤프 파일로 저장하고,

배치 처리로 필요한 자료만 DB에 저장하는 것이 일반적입니다.

 

만일 모니터링을 위한 것이라면, DB에 저장하지 않고 모니터링만 구현하고, alert 쪽에만 DB에 저장하지요.

 

분명 어떤 목적 때문에, 패킷을 저장하려고 할터인데, 그 모든 패킷이 그 목적에 부합되지는 않을겝니다. 버릴 것을 버리고, 취할 것을 취하는 방식으로 문제를 풀어야하지 않을까싶네요.

 

분산처리란, DB 서버를 물리적인 다른 호스트에 각각 두고, 자기가 맡은 부분만 DB에 저장하는 방식을 이야기한 것이였습니다.

이쪽으로 가면, 나중에 다시 자료를 취합해서 보여주는 하우징 쪽 작업이 필요하겠지요.

 

김상기(ioseph)님이 2005-11-09 14:21에 작성한 댓글입니다.

네트웍 주소를 위한 데이터 타입이 있습니다.

cidr 12 or 24 bytes IPv4 and IPv6 networks

inet 12 or 24 bytes IPv4 and IPv6 hosts and networks

이걸 쓰셨으면 데이터 저장크기를 줄이실 수 있었을터인데;

http://database.sarang.net/database/postgres/manual/manual-8.0/datatype-net-types.html

 

4분에 20만개, 1분에 5만개, 1초에 833.3개면 구조에 따라 속도가 빠를 수 있습니다.

저라면 시간대 별로 테이블을 따로 구성하고 인덱스를 걸지 않고 데이터를 일단 빠르게 삽입한 후에 통계 테이블이 추후에 정산해서 통계 데이터만 가지도록 하겠습니다 -.-;

데이터 아카이브가 남아있어야 한다면 그 테이블 그대로 저장해 놓으면 되겠죵..

 

신기배(소타)님이 2005-11-09 21:08에 작성한 댓글입니다.

두분의 글 감사드리고요, 신기배님 글에 궁금점이 있어 좀 물어보겠습니다.

현재 신기배님이 말씀하신것 처럼 인서트하는 테이블과 통계내는 테이블도 따로 있고, 인서트하는 테이블은 5분마다 초기화됩니다.

말씀중에 '우선 인서트만 빠르게 한다.'라고 되어있는데, 인서트를 빠르게 하는 방법을 알 수 있을까요. 인덱스를 걸면 인서트가 느려지게 되나요?

 마지막 궁금한것은 이전에는 네트웍주소라고 하여 숫자10자리로 변형하여 인서트하여 사용했었는데, 데이터 저장크기로 인해 차이가 많이 나게 되는건지 궁금합니다. 그렇다면, IP(111.111.111.111)을  234143234(예)와 같이 네트웍주소로 변경하고 프로토콜도 번호로 변경하면 속도가 향상될 수 있다는 것인지 궁금하네요.

글쓴이님이 2005-11-10 11:02에 작성한 댓글입니다.
이 댓글은 2005-11-10 11:03에 마지막으로 수정되었습니다. Edit

인덱스를 걸어놓으면 갱신(삽입, 수정)이 느립니다.

111.111.111.111는 문자열로 최대 15바이트 입니다.

네트웍 주소 전용 데이터 타입인 cidr이나 inet을 써도 데이터 저장크기가 12바이트로 줄어들 수 있고요

ipv6를 고려하지 않는다고 하면 4바이트 int형으로 저장할 수도 있겠죠..

저정할 데이터의 크기가 작으면 작을수록 미약하더라도 속도 향상이 있겠죠?

신기배(소타)님이 2005-11-10 11:18에 작성한 댓글입니다.

이런경우를 안겪어봐서 모르겠지만, 일반적인 경우

트랜잭션을 걸고 insert 주욱 한 후에 commit 하는 것이 빨랐습니다.

그냥 주욱 저장하는 것이라면, 100건정도 모았다가 commit 하는 방식도 괜찮을것 같습니다.

copy 구문도 좋은 방법이라 생각합니다.

단 이 역시 마찬가지로 모았다가 쿼리하는것이 중요하죠.

 

-----------

윈도 불여우에서 글을 적는 팝업창의 모든글이 깨알처럼 작게 나옵니다.

안보여요 >_<

송효진님이 2005-11-10 17:04에 작성한 댓글입니다. Edit

그런데 insert 했을 때 쿼리되었다면, 그것으로 처리가 끝나는것이 맞겠지요?

그러면 메모리가 가득 찬다는 것은,

insert 속도가 느려서 c 로 작성된 프로그램에 대기중인 패킷정보가 가득 찼다고 보는것이 맞는게 아닐까요?

포스트그래스가 메모리를 많이 소비할 일은 없는것이겠지요?

insert 만으로 vacuum 할 일은 없을테니까요.

송효진님이 2005-11-10 17:08에 작성한 댓글입니다. Edit

재미있는 토론이 있었네요.

저도 비슷한 상황을 경험했는데요. 빠르게 insert를 수행하려면...

 

1) index를 가능한 없앤다. pgsql의 index update 속도는 좀 심하게 느린편입니다.

 

2) 가능하면 copy를 사용한다. copy는 트렌젝션 처리가 안되지만 속도는 몇배 빠른 것으로 알고 있습니다. 정확히 기억나지는 않지만 한두배 빠른 정도가 아닙니다. 엄청 빠르죠...

 

3) 트렌젝션을 사용한다. autocommit은 IO를 많이 발생시킵니다.

 

4) WAL 디렉토리를 별도의 하드(파티션이 아닙니다.)로 옮긴다. IO를 분산시켜주기 때문에 속도가 빨라집니다.

 

제 생각에는 pcap으로 패킷 수집하는 녀석은 그냥 일반 파일에 log를 저장하고 다른 또 다른 프로그램(또는 다른 thread)이 이것을 DB에 복사해 넣거나 통계만 넣도록 하는 것이 좋을 것 같습니다. 자칫하면 송효진님 말씀데로 패킷 캡쳐 속도를 DB가 못 따라올 수 있으니까요.

 

그리고 저도 불여우 쓰는데요. 리눅스에서요. 좀 작기는 하네요. 그래서 오타가 많습니다. (변명... ㅋㅋ) 하지만 깨알만 하지는 않네요. 콩알만 합니다. ^^

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

글써 주신 모든분들 김상기,신기배,송효진,박성철님께 감사드립니다.

또 마지막에 정리와 경험을 적어주신 박성철님께 감사드려요. 그 댓글을 보니, 제가 수정을 해야할게 많은게 같고 왠지 해결 할 수 있을거 같습니다.^^ 제가 저 노하우로 하면 시간이 좀 걸릴거 같내요.. 하고 나서 결과 알려드리꼐요..^^ 다들 매우 감사드립니다.

//////////결과

세가지만 했는데도 잘 됩니다..^^

바꾼내용 :

1. insert를 집중적으로 하는 테이블의 index를 없앤다.

2. 패킷을 받아서 바로 인서트 하는 것이 아니라, 파일에 일괄적으로 적습니다.

3. copy나 insert를 통해 디비에 넣습니다.(insert보단 copy가 효율적인거 같은데, 제가 쓴 곳에선 copy하다가 가끔씩 에러가..^^;; 좀 만 더 손보면 잘 돌아갈 거 같아요..)

도움 주신분들께 다시 한번 감사 말씀 드립니다..^^

 

글쓴이님이 2005-11-11 10:55에 작성한 댓글입니다.
이 댓글은 2005-11-18 10:10에 마지막으로 수정되었습니다. Edit
[Top]
No.
제목
작성자
작성일
조회
6413SQL_ASCII 의 DB 를 UNICODE 로 변경하려면. [1]
가우나라
2005-11-11
2441
6412Group by 질문이여... [1]
조성배
2005-11-11
2080
6411vacuum 에 관해서 질문드립니다. [3]
가우나라
2005-11-11
2990
64081분에 4만개의 데이터를 인서트하면서... [10]
이정호
2005-11-09
4503
6405김상기님의 prepared query의 위험한 외줄타기를 읽고(2)...
초보대왕
2005-11-07
2202
6404에러 해결방법좀 알려주세요... [1]
나그네
2005-11-07
2230
6402김상기님의 prepared query의 위험한 외줄타기를 읽고... [2]
초보대왕
2005-11-05
2508
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.019초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다