TClientDataSet Next() langsam?
Von: Harald Plontke (news@plontke.de) [Profil]
Datum: 11.10.2007 21:59
Message-ID: <felva5$scu$03$1@news.t-online.com>
Newsgroup: de.comp.lang.delphi.datenbanken
Datum: 11.10.2007 21:59
Message-ID: <felva5$scu$03$1@news.t-online.com>
Newsgroup: de.comp.lang.delphi.datenbanken
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
[ Auf dieses Posting antworten ]Antworten
- Norbert Winkler (01.11.2007 14:41)
