Autor Beitrag
Lucky83
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 12.10.05 11:45 
Hallo,

ich greife über eine clientDataSet, die mit einer SQLConnection (..SQLDataSet, Provider..) verbunden ist auf eine Datenbank (Firebird) zu. In einer Tabelle befinden sich so ca 5.000 Datensätze und die clientDataSet braucht ewig bis sie die Daten läd bzw. die Tabelle öffnet Wenn ich vergleichsweise den selben SQL-Befehl im Explorer abschicke geht es um einiges schneller.
In der Datenbank hab ich natürlich auch Indices gesetzt und die SQL-Befehle haben alle eine "where" Bedingung.
Einstellungen:
Bei der SQLDataSet hab ich GetMetaData auf "false" gesetz.

Hat jemand eine Ahnung an was das legen könnte?
MAlsleben
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 303

W2k,WinXP
D3 - DXE3 Enterprise
BeitragVerfasst: Do 13.10.05 10:47 
Hi,

das ClientDataset arbeitet mit einer lokalen Kopie der Daten im Arbeitsspreicher. Das bedeutet die koplette Tabelle wird erst übers Netz gezogen, in das Format von ClientDataset im Arbeitsspeicher umgemodelt und dann angezeigt. Das dauert eben. Im SQL Explorer werden nicht alle Datensätze gezogen, Click dort mal auf den Button, um nach dem Select auf das Ende der Tabelle zu gehen, das braucht dann je nach Tabellengröße auch einen Moment.

Übrigens, was verstehst Du unter ewig genau in dem Zusammenhang?

Gruß Micha.

_________________
Viele Wege führen nach Rom.
Lucky83 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 14.10.05 17:16 
Also unter ewig meine ich so ca 20-30 Sekunden und wenn ich es über den SQL-Explorer mache und dann an das Ende der Datenbank gehe, dauert das dann so ca 3 sek. Also schon ein krasser Unterschied... :?
globetrotter77
Hält's aus hier
Beiträge: 1

WIN 2000
Turbo Delphi Explorer
BeitragVerfasst: Fr 30.01.09 18:04 
user profile iconLucky83 hat folgendes geschrieben Zum zitierten Posting springen:
Hallo,

ich greife über eine clientDataSet, die mit einer SQLConnection (..SQLDataSet, Provider..) verbunden ist auf eine Datenbank (Firebird) zu. In einer Tabelle befinden sich so ca 5.000 Datensätze und die clientDataSet braucht ewig bis sie die Daten läd bzw. die Tabelle öffnet Wenn ich vergleichsweise den selben SQL-Befehl im Explorer abschicke geht es um einiges schneller.
In der Datenbank hab ich natürlich auch Indices gesetzt und die SQL-Befehle haben alle eine "where" Bedingung.
Einstellungen:
Bei der SQLDataSet hab ich GetMetaData auf "false" gesetz.

Hat jemand eine Ahnung an was das legen könnte?


Der Eintrag ist zwar schon uralt, aber vielleicht besteht ja gerade deswegen eine Chance, dass Lösungen vorhanden sind.
Ich habe nämlich ein ähnliches Problem, und vielleicht hat es auch denselben Grund.
Ich verwende Turbo Delphi Explorer mit Firebird 2.1.

Es schaut so aus, als wäre es völlig ohne Bedeutung, ob man in einer Datenbank Indizes definiert oder nicht, die ClientDataSet-Komponente kennt diese Indizes einfach nicht.
Und es scheint auch keinen Work-Around für dieses Problem zu geben.
Folge bei meinem Programm: Bei jedem Programmstart muss der aktuell verwendete Index wieder neu aufgebaut werden. Das gilt auch für einen Wechsel zu einem anderen Index.
Allerdings bleiben die Indizes zumindest während des Programmlaufs dann erhalten, zumindest, wenn man die IndexDefs verwendet.

Bei ca. 100000 Datensätzen macht sich dieses Verhalten schon ziemlich extrem bemerkbar.
Und es ist für mich völlig unverständlich, wieso ich einen ganz wesentlichen Teil der DB-internen Intelligenz nicht nutzen kann.

Ich nehme mal an, dass du aus einem ähnlichen Grund auf die Nase gefallen bist.
Es waren zwar Indizes in der DBdefiniert, diese wurden aber vom ClientDataSet nicht erkannt. Meine Vermutung: WHERE-Klauseln können keinen Indexnutzen und sind deswegen gnadenlos langsam.

Hat sonst noch irgendjemand Erfahrungen zu diesem Thema gesammelt?
Oder kennt jemand einen Trick, wie man diese Einschränkung umgeht?

Vielen Dank im voraus

Harald