C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[53236] Re:DB 처리방법 개선할 점을 알려주세요.
박지훈.임프 [cbuilder] 1783 읽음    2008-04-23 17:21
사용하신 방식에 별다른 문제점은 보이지 않네요. ClientDataSet은 메모리 테이블인데, 메모리가 실제 디비에 갔다오는 것보다는 빠르다고 해도 1000번 호출에 3초면 꽤 준수한 수준이구요.

다만, 성능을 좀 더 향상시키려면, 아래와 같은 코드에서,
ClientDataSet->FieldValues["VALUE_A"] = valueA;
사용하신 FieldValues[] 속성은 FieldByName()을 사용한 것과 비슷한데, 주어진 이름으로 필드를 찾는 과정이 들어가므로 아무래도 조금은 느립니다. 게다가 FieldByName()에서는 AsString이나 AsInteger처럼 네이티브 데이터를 넣을 수 있는데, FieldValues[]는 variant 데이터이므로 조금 더 느려집니다.

좀 더 빠른 방법은 필드이름 대신 Fields[] 속성에 인덱스를 넘기는 방법이고, 가장 빠른 방법은 필드 컴포넌트를 디자인타임에 정적으로 생성시키는 겁니다. 이런 경우 각각의 필드 이름은 ClientDataSetVALUE_A 이렇게 만들어지니까, ClientDataSetVALUE_A->AsInteger 이렇게 사용하게 됩니다.

물론 이런 방식의 차이에서 나타나는 속도의 차이는 근소합니다. 하지만 만약 ClientDataSet에 필드가 아주 많을 때라면.. 예를 들어 30~40개 수준이 넘는다면 성능 차이가 팍팍 나고요. 필드가 적은 경우라도 말씀하신 것처럼 한번에 1000번씩이나 배치성으로 돌린다면, 그 차이가 아주 크지는 않아도 꽤 의미있는 시간 간격이 될 수도 있습니다.

그럼...


도와주세요 님이 쓰신 글 :
: 안녕하세요.
:
: FIrebird2.1을 dbexpress를 가지고 DB 처리를 합니다.
:
: TSQLConnection - TSQLDataSet - TDataSetProvider - TClientDataSet
: 로 연결하였고, TSQLDataSet의 CommandType은 ctTable로 하였습니다.
:
: Table이 ID, VALUE_A, VALUE_B 3개의 필드와 36,000  의 레코드로 이루어졌습니다.
: 일련의 처리를 통해 나온 결과를 DB에 업데이트 하기 위해 다음과 같은 함수를 사용했습니다.
:
: WriteDB 함수가 한 1000번 호출하고 그 후 UpdateDB를 호출해서 DB갱신을 합니다.
: 이 과정에서 WrtieDB 호출 1000번에 3초 정도, UpdateDB에 12~13초 정도가 소모됩니다.
: DB를 안 써봐서 그러는데 이 정도 성능이 맞는 것인지요?
: 제 방법이 잘 못 되었는지요?
: 개선방법을 알려주시면 감사하겠습니다. ^^;
:
: DB를 구동하는 컴사양은 코어2듀어 1.86, 2GB입니다.
:
: bool TMyDM::WriteDB(AnsiString id, AnsiString valueA, AnsiString valueB)
: {
:     TLocateOptions Opt;
:     Opt = Opt << loCaseInsensitive;
:
:     bool result;
:
:     result = ClientDataSet->Locate("ID", id, Opt);
:
:     if (result)
:     {
:         ClientDataSet->Edit();
:         ClientDataSet->FieldValues["VALUE_A"] = valueA;
:         ClientDataSet->FieldValues["VALUE_B"] = valueB;
:
:         ClientDataSet->Post();
:         return true;
:     }
:
:     return false;
: }
:
: bool TMyDM::UpdateDB(void)
: {
:         ClientDataSet->ApplyUpdates(-1);
: }

+ -

관련 글 리스트
53192 DB 처리방법 개선할 점을 알려주세요. 도와주세요 1228 2008/04/21
53236     Re:DB 처리방법 개선할 점을 알려주세요. 박지훈.임프 1783 2008/04/23
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.