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
운영게시판
최근게시물
CUBRID Q&A 430 게시물 읽기
No. 430
Q.테스트를 해보았습니다.
작성자
그리너
작성일
2007-08-02 11:13
조회수
3,946

디폴트로 설치를 한 후...

 

테이블 생성. (필드는 int형 하나만 생성).

 

랜덤으로 정수값을 생성후 테이블에 집어넣었습니다.

(INSERT INTO table VALUES(234234)

 

저는 10만개를 집어넣으려 했으나...

 

18000개 입력하는데도...수십분이 걸려서 중간에 중단시켰습니다.

 

select하는대도 많이 느린데요...

 

리눅스에서 테스트 했는데...

 

커널의 최적화 세팅 같은 건 있는지요?

 

위 처럼 테스트 할 때 튜닝은 어떤 식으로 하는게 좋나요?

 

 

 

 

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

안녕하세요.

CCI 는 일반적인 운영을 위한 업무용으로 사용하시기에 적당하며, 지금 하시는 것과 같은 대략의 데이터를 입력하는데는 적당하지 않습니다. 대량의 데이터를 입력하기 위해서는 C-API 를 사용하는 것이 보다 효과적입니다.

아래에 C-API 를 이용한 간단한 소스를 첨부하니 참고하시기 바랍니다.

 

<Class Name>

db_test

<Attributes>

esm_date : character varying(30) NON_NULL

proto : integer NON_NULL

src_ip : character varying(20) NON_NULL

dst_ip : character varying(20) NON_NULL

src_port : integer NON_NULL

dst_port : integer NON_NULL

session_id : character varying(20)

 

 

include \"dbi.h\"

#include <time.h>

 

test1(int COMMIT_COUNT)

{

char buf[20];

time_t timer;

struct tm *tm;

 

int i;

char esm_date[31];

int proto = 1;

char src_ip[21] = \"192.168.1.1\";

char dst_ip[21] = \"192.168.1.2\";

int src_port = 80;

int dst_port = 8080;

char session_id[21];

 

// database 입력을 위한 template

DB_OTMPL *tmpl;

// database 와 응용프로그램 사이에 값을 전달하는 구조체(value container)

DB_VALUE value;

// obejct identifer 로 여기서는 class에 대한 oid 를 보관한다.

DB_OBJECT *class_oid;

// database 의 table 안의 각 field 들에 대한 descriptor

DB_ATTDESC *ad_esm_date, *ad_proto, *ad_src_ip, *ad_dst_ip, *ad_src_port, *ad_dst_port, *ad_session_id;

 

// table 에 대한 oid 를 찾는다. 찾아진 oid 는 이후 일부 API 에서 table 을 이름을 대신하여 사

용된다.

class_oid = db_find_class(\"db_test\");

if (class_oid == NULL) {

printf(\"class db_test not found\\n\");

return -1;

}

// table 의 각 field 에 대한 descriptor 를 찾아 변수에 할당한다.

db_get_attribute_descriptor(class_oid, \"esm_date\", 0, 0, &ad_esm_date);

db_get_attribute_descriptor(class_oid, \"proto\", 0, 0, &ad_proto);

db_get_attribute_descriptor(class_oid, \"src_ip\", 0, 0, &ad_src_ip);

db_get_attribute_descriptor(class_oid, \"dst_ip\", 0, 0, &ad_dst_ip);

db_get_attribute_descriptor(class_oid, \"src_port\", 0, 0, &ad_src_port);

db_get_attribute_descriptor(class_oid, \"dst_port\", 0, 0, &ad_dst_port);

db_get_attribute_descriptor(class_oid, \"session_id\", 0, 0, &ad_session_id);

 

time(&timer);

tm = localtime(&timer);

sprintf(buf, \"start %02d:%02d:%02d\", tm->tm_hour, tm->tm_min, tm->tm_sec);

 

for (i = 1; i <= 100000; i++) {

// database 에 입력을 위하여 template 를 생성한다

tmpl = dbt_create_object(class_oid);

 

time(&timer);

tm = localtime(&timer);

sprintf(esm_date, \"%04d-%02d-%02d %02d:%02d:%02d\", tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec);

// 문자열 타입의 값을 value container 에 넣는다.

db_make_string(&value, esm_date);

// value container 의 값을 template 에 넣는다.

dbt_dput(tmpl, ad_esm_date, &value);

 

// 정수 타입의 값을 value container 에 넣는다.

db_make_int(&value, proto);

dbt_dput(tmpl, ad_proto, &value);

 

db_make_string(&value, src_ip);

dbt_dput(tmpl, ad_src_ip, &value);

 

db_make_string(&value, dst_ip);

dbt_dput(tmpl, ad_dst_ip, &value);

 

db_make_int(&value, src_port);

dbt_dput(tmpl, ad_src_port, &value);

 

db_make_int(&value, dst_port);

dbt_dput(tmpl, ad_dst_port, &value);

 

sprintf(session_id, \"%d\", i);

db_make_string(&value, session_id);

dbt_dput(tmpl, ad_session_id, &value);

 

// template 의 내용을 실제 database 에 입력한다.

if (dbt_finish_object(tmpl) == NULL) {

printf(\"input error : %s\\n\", db_error_string(3));

db_abort_transaction();

return -1;

}

 

if (i % COMMIT_COUNT == 0) {

db_commit_transaction();

printf(\"%d committed\\n\", i);

}

}

 

db_commit_transaction();

 

time(&timer);

tm = localtime(&timer);

printf(\"%s\\nend %02d:%02d:%02d\", buf, tm->tm_hour, tm->tm_min, tm->tm_sec);

}

 

 

main(int argc, char *argv[0])

{

if (argc == 0) {

printf(\"Usage : %s <commit count>\\n\", argv[0]);

return 0;

}

 

// database tdb 와 연결한다.

if (db_restart(argv[0], 0, \"tdb\") < 0) {

printf(\"CONNECT error\\n\");

return -1;

}

 

test1(atoi(argv[1]));

 

// database 와 연결을 해제한다.

db_shutdown();

}

 

>디폴트로 설치를 한 후...

>

>테이블 생성. (필드는 int형 하나만 생성).

>

>랜덤으로 정수값을 생성후 테이블에 집어넣었습니다.

>(INSERT INTO table VALUES(234234)

>

>입력은 CCI API를 이용해서 broker로 연결해서 집어넣었습니다.

>

>저는 10만개를 집어넣으려 했으나...

>

>18000개 입력하는데도...수십분이 걸려서 중간에 중단시켰습니다.

>

>18000개 전체 select하는대도 많이 느린데요..

>

>리눅스에서 테스트 했는데...

>

>kernel 2.6에 glibc2.3.4입니다.

>

>커널의 최적화 세팅 같은 건 있는지요?

>

>위 처럼 테스트 할 때 DB 튜닝으로 성능을 끌어올릴 수 있나요?

 

남재우님이 2007-08-02 11:38에 작성한 댓글입니다. Edit

CCI 를 사용하실때 commit 주기를 어떻게 주셨는지 궁금합니다. 혹시 건단위로 commit 을 수행하셨다면 10000 건 정도 입력후 commit 하는 것으로 하신후 확인해보시기 바랍니다.

 

>디폴트로 설치를 한 후...

>

>테이블 생성. (필드는 int형 하나만 생성).

>

>랜덤으로 정수값을 생성후 테이블에 집어넣었습니다.

>(INSERT INTO table VALUES(234234)

>

>입력은 CCI API를 이용해서 broker로 연결해서 집어넣었습니다.

>

>저는 10만개를 집어넣으려 했으나...

>

>18000개 입력하는데도...수십분이 걸려서 중간에 중단시켰습니다.

>

>18000개 전체 select하는대도 많이 느린데요..

>

>리눅스에서 테스트 했는데...

>

>kernel 2.6에 glibc2.3.4입니다.

>

>커널의 최적화 세팅 같은 건 있는지요?

>

>위 처럼 테스트 할 때 DB 튜닝으로 성능을 끌어올릴 수 있나요?

 

남재우님이 2007-08-02 17:23에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
433Q.[재문의] serial_serial이라는걸 등록하는방법 [1]
이준구
2007-08-02
3689
432Q.[문의] Unisql 올리고 나서 서비스 올리면 다음과 같은 메세지 나오면서 서비스 에러 납니다 [1]
이준구
2007-08-02
4029
431Q.데비안은 지원 안하나요??? [1]
들뿔
2007-08-02
3760
430Q.테스트를 해보았습니다. [2]
그리너
2007-08-02
3946
429Q.데비안에서 Install 할려고 하는데요..
들뿔
2007-08-02
3903
428Q.클래스 삭제에 관해서.. [1]
클래싱
2007-08-01
3743
427큐브리드, 엔터프라이즈 환경에서 쓸만 한가요 [1]
해나
2007-08-01
3996
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.019초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다