TClientDataSet Next() langsam?

11/10/2007 - 21:59 von Harald Plontke | Report spam
Hallo,

ich habe ein Problem mit TClientDataSet. Habe schon etliche Stunden mit
Google recherchiert, aber keine Hinweise gefunden.

Ich benutze ein TClientDataSet, um Daten der Datenbank (Oracle, MSSQL oder
Firebird) im Speicher zu cachen und dann für jeden Berechnungsschritt den
passenden Datensatz zu suchen. Dazu öffne ich zuerst den TClientDataSet (das
dauert ca 2 Sekunden, macht aber nichts, da das nur einmal am Anfange der
Berechnung mit vielleicht einigen hundert bis tausend Berechnungsdurchlàufen
passiert), und mache dann jeweils ein TClientDataSet->First(), gehe mit
TClientDataSet->Next() alle Datensàtze durch, bis ich den richtigen gefunden
habe. Im TClientDataSet sind ca. 10000-50000 Datensàtze.
Da sich das ja alles im Speicher abspielt, müsste das ja sehr schnell gehen,
tut es aber nicht. Eine Schleife wie (sorry, ist CBuilder, aber vom Problem
her müsste das auf Delphi ja auch zutreffen):

TField *pField1 = pTClientDataSet->Fields->Fields[0];
TField *pField2 = pTClientDataSet->Fields->Fields[1];
TField *pField3 = pTClientDataSet->Fields->Fields[2];
TField *pField4 = pTClientDataSet->Fields->Fields[3];
TField *pField5 = pTClientDataSet->Fields->Fields[4];

pTClientDataSet->First();
while(!pTClientDataSet->Eof)
{
if((iAmnr < 0 || pField1->AsInteger == iAmnr) && // AMNR
(iAzmnr < 0 || pField2->AsInteger == iAzmnr) && // AZMR
pField3->AsString == sTagestypWochentag && // ZY_TAG
pField4->AsDateTime >= dtDatum && // DATBIS
pField5->AsDateTime <= dtDatum) // DATVON
{
break; // erster passender Datensatz
}
pTClientDataSet->Next();
}

dauert, wenn ein gesuchter Datensatz sich am Ende befindet, fast eine
Sekunde.
Im TClientDataSet und im Provider ist alles auf ReadOnly gesetzt.

Ist das normal? Gibt es eine Einstellungmöglichkeit im TClientDataSet, die
das Scrollen in der Datenmenge beschleunigen könnte? Aus meinen sonstigen
Programmiererfahrungen auf diversen Computern (selbst in den Anfangszeiten
mit einem 8Mhz Atari) weiss ich, dass eine Suche im Speicher in àhnlich
grossen Arrays eingentlich kaum eine messbare Zeit beansprucht.

Vielleicht werden beim Next() ja diverse Ereignisse im Hintergrund
getriggert, die ich bei einer reinen Readonly-Datenmange zum Scrollen
eventuell gar nicht brauche?

Als Alternative sehe ich nur, eine eigene TClientDataSet-àhnliche
Klasse/Array zu programmieren, die das Ganze dann optimiert?

Für einen Hinweis wàre ich jedenfalls sehr dankbar,

Viele Grüsse,

Harald
 

Lesen sie die antworten

#1 Norbert Winkler
01/11/2007 - 14:41 | Warnen spam
Am Thu, 11 Oct 2007 21:59:26 +0200 schrieb Harald Plontke:

Hallo,

ich habe ein Problem mit TClientDataSet. Habe schon etliche Stunden mit
Google recherchiert, aber keine Hinweise gefunden.

Ich benutze ein TClientDataSet, um Daten der Datenbank (Oracle, MSSQL oder
Firebird) im Speicher zu cachen und dann für jeden Berechnungsschritt den
passenden Datensatz zu suchen. Dazu öffne ich zuerst den TClientDataSet (das




Also ich würde das in jedem Fall in einer TObjectList (oder was eigenem)
mit einer speziellen Klasse machen, und bei > 10000 Sàtzen mit binàrer
Suche arbeiten. Da hast bei jeder Suche statt im Mittel 5000 nur ~15
Vergleiche.
Außerdem hat eine eigene Klasse immer Vorteile...

Muss es ein CDS bleiben, könntest du evtl. einen Index setzen und FindKey
nehmen


Norbert

Ähnliche fragen