|
사용하신 방식에 별다른 문제점은 보이지 않네요. 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);
: }
|