Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi ClientDataSet - wie kann man Indizes verwenden? (https://www.delphipraxis.net/128397-clientdataset-wie-kann-man-indizes-verwenden.html)

globetrotter77 29. Jan 2009 07:59

Datenbank: Firebird • Version: 2.1 • Zugriff über: SQLConnection

ClientDataSet - wie kann man Indizes verwenden?
 
Hallo!

Bin ich zu doof dafür, oder gibt es wirklich gar keine Möglichkeit, mit TClientDataSet auf die in der DB definierten Indizes zurückzugreifen?

Zitat aus der Hilfe:
Es gibt drei Möglichkeiten, einer Client-Datenmenge einen neuen Index hinzuzufügen:
1) Die Eigenschaft TCustomClientDataSet.IndexFieldNames verwenden
... Diese Indizes bleiben nicht erhalten, wenn Sie die Datenmenge schließen ...
2) TCustomClientDataSet.AddIndex aufrufen
... Mit AddIndex erstellte Indizes werden beim Schließen der Client-Datenmenge nicht beibehalten ...
3) Die Eigenschaft TCustomClientDataSet.IndexDefs verwenden
... Als dritte Möglichkeit können Sie einen Index zu dem Zeitpunkt erstellen, zu dem die Client-Datenmenge erzeugt wird ...
... Auf diese Weise erzeugte Indizes sind persistent und werden gespeichert, ...

Sieht so aus, als käme nur Variante 3 in Frage. Aber merkwürdigerweise werden diejenigen Indizes, die bereits in der DB vorhanden sind, überhaupt nicht berücksichtigt. Heißt das nun, dass ich alle DB-Definitionen nicht mehr mit einem DB-Tool durchführen kann, sondern mit Delphi selber stricken muss?

Das widerspricht ja schon ein bisschen dem Prinzip der Trennung von Daten und Programm, oder?

Was käme denn statt ClientDataSet noch in Frage?

Danke im Voraus

Harald


PS: ich verwende Turbo Delphi Explorer

globetrotter77 29. Jan 2009 18:43

Re: ClientDataSet - wie kann man Indizes verwenden?
 
ich heb das noch mal nach oben ...

wie ist die Formulierung aus der Hilfe unter Punkt 3) nun wirklich zu verstehen?
Delphi-Quellcode:
3) Die Eigenschaft TCustomClientDataSet.IndexDefs verwenden
... Als dritte Möglichkeit können Sie einen Index zu dem Zeitpunkt erstellen, zu dem die Client-Datenmenge erzeugt wird ...
... Auf diese Weise erzeugte Indizes sind persistent und werden gespeichert, ...

Ich hätte gedacht, dass "IndexDefs verwenden" heißt, man kann über die IndexDefs den passenden Index auswählen. So wie sonst eben auch. Geht aber nicht.
Bedeutet im Klartext vermutlich auch, dass eine der wichtigsten Eigenschaften einer DB nicht genutzt werden kann.
Oder habe ich nur etwas übersehen???

mkinzler 29. Jan 2009 19:09

Re: ClientDataSet - wie kann man Indizes verwenden?
 
Nicht auswählen sondern erzeugen

globetrotter77 29. Jan 2009 19:16

Re: ClientDataSet - wie kann man Indizes verwenden?
 
wann erzeugen???

ich habe ne Datenbank, die im aktuellen Fall ca. 100000 Datensätze enthält, über die ich mehrere Indizes legen will (eben, weil es so viele sind).

Das will ich genau einmal machen, aber wie?

globetrotter77 29. Jan 2009 19:19

Re: ClientDataSet - wie kann man Indizes verwenden?
 
sorry, soll natürlich heißen:
nicht die Datenbank, sondern eine Tabelle aus der Datenbank enthält ca. 100000 Sätze.
In anderen Fällen können es auch mal 500000 sein.
Da will man die Indizes natürlich auf Dauer erhalten wissen.

mkinzler 29. Jan 2009 19:20

Re: ClientDataSet - wie kann man Indizes verwenden?
 
Delphi-Quellcode:
<ds>.IndexDef.Add()

globetrotter77 29. Jan 2009 19:27

Re: ClientDataSet - wie kann man Indizes verwenden?
 
IndexDefs.Add kenne ich schon, aber was ist denn der Unterschied zwischen einem selbst (also vom eigenen Programm) generierten und einem fremdgenerierten Index. Die Indizes sind ja schon da, aber warum sehe ich sie nicht??

Thomas F 29. Jan 2009 19:40

Re: ClientDataSet - wie kann man Indizes verwenden?
 
Ich hab mal ne Datenbank mit Clientdataset erstellt, und man konnte die Spalten
sortieren , indem man oben auf den Spaltennamen geklickt hat.

Das war dieser Code

Delphi-Quellcode:
procedure TForm1.DBGrid2TitleClick(Column: TColumn);
begin
  try
   ClientDataset2.IndexFieldNames := Column.FieldName;
  except
    ShowMessage('Das Feld kann nicht sortiert werden' + Column.FieldName);
end;
end;

globetrotter77 29. Jan 2009 19:52

Re: ClientDataSet - wie kann man Indizes verwenden?
 
@Thomas:

richtig! das geht auch wunderbar, aber ab einer bestimmten Größe dauert es einfach zu lange, weil der Index nach jedem Programmstart wieder neu aufgebaut werden muss.
Dauert bei 100000 Sätzen zwar immer noch "nur" ca. 5 Sekunden, aber das gilt für jeden Index.
Hat man also mehrere Indizes zu verwalten und evtl. noch mehr Datensätze, dann wird es irgendwann einmal unzumutbar für den Benutzer.
Deshalb gibt es ja auch normalerweise bei einer DB die Möglichkeit, einen Index nachträglich hinzuzufügen, um so Performance-Gewinne herauszuholen.
Der beste Performance-Gewinn hilft aber nicht weiter, wenn man das immer wieder neu machen muss.
:cry:

Harald

Thomas F 29. Jan 2009 20:14

Re: ClientDataSet - wie kann man Indizes verwenden?
 
Da kenn ich mich leider nicht aus.

Vielleicht ne andere Datenbank nehmen, die für große Datenmengen besser geeignet ist.

globetrotter77 29. Jan 2009 20:17

Re: ClientDataSet - wie kann man Indizes verwenden?
 
@Thomas F:

tja, genau da liegt das Problem!
Interbase bzw. Firebird ist eigentlich sehr wohl für große Datenmengen geeignet, aber offenbar nicht in dieser Kombination.

Trotzdem danke für deine Hilfe!

mkinzler 29. Jan 2009 20:19

Re: ClientDataSet - wie kann man Indizes verwenden?
 
Das hat aber nichts mit dem DBMS zu tun, sondern mit der TClienDataSet-Komponente

omata 29. Jan 2009 20:19

Re: ClientDataSet - wie kann man Indizes verwenden?
 
Deine Tabellen haben aber auch Schlüssel?

globetrotter77 29. Jan 2009 20:31

Re: ClientDataSet - wie kann man Indizes verwenden?
 
@mkinzler:
das sehe ich auch so ... TClientDataSet stellt scheinbar einfach nichts dergleichen zur Verfügung, oder ich habe es noch nicht herausgefunden, wo es versteckt liegt.
Merkwürdig aber trotzdem der Hinweis mit den persistenten Indizes ... grummel

Gibt es evtl. eine andere dataset-artige Komponente, mit der man das bewerkstelligen kann?

Mein Problem ist einfach, dass ich weg will von der BDE, die nichts als Probleme bereitet und ja auch hoffnungslos veraltet ist.

Firebird als DB scheint mir durchaus geeignet zu sein, aber wenn die Vorteile der Datenbank nicht genutzt werden können, ist es ja fast schon egal, welche DB ich verwende.

globetrotter77 29. Jan 2009 20:33

Re: ClientDataSet - wie kann man Indizes verwenden?
 
@omata:

Mit Indizes meine ich eigentlich Schlüssel, klar habe ich die!
Besser gesagt: ich will sie haben, aber es geht nicht!

mkinzler 29. Jan 2009 20:36

Re: ClientDataSet - wie kann man Indizes verwenden?
 
Vielleicht eine andere Komponente

omata 29. Jan 2009 20:36

Re: ClientDataSet - wie kann man Indizes verwenden?
 
Das verstehe ich jetzt nicht. Schlüssel oder Indizes was denn nun?

Ich verwendet Firebird locker mit >1000000 pro Tabelle und das ist richtig schnell. Ich verstehe deine Probleme nicht, was machst du da?

mkinzler 29. Jan 2009 21:09

Re: ClientDataSet - wie kann man Indizes verwenden?
 
@omata: Er greuft ja nicht direkt, sondern über ein ClientDataSet zu

globetrotter77 29. Jan 2009 21:20

Re: ClientDataSet - wie kann man Indizes verwenden?
 
@omata:

sehr gut, dann weißt du ja, was richtige Datenmengen sind.

also:
ich habe eine SQLConnection für die Firebird-DB und ein SQLDataSet für eine der Tabellen aus der DB.
Dann einen DataSetProvider, der mit dem TSQLDataSet verbunden ist, und ein ClientDataSet, das auf den DataSetProvider zugreift.

Die DB habe ich mit ISQL erstellt (inkl. Index-Definitionen), die Daten wurden mit einem anderen Programm aus einer anderen Datenbank importiert.

Und jetzt will ich gerne mit meinem Programm einigermaßen elegant mit den Daten umgehen.
Das heißt aber auch, dass ich ab und zu die Daten in einer anderen Sortierung haben will.
Hierzu klicke ich in einem DBGrid einfach auf die Titelleiste und stelle den Index im OnTitleClick-Event um.

Das geht auch einigermaßen flott, weil ich die verschiedenen Index-Definitionen per Hand zur Entwurfszeit eingetragen habe, aber eben immer erst ab der zweiten Verwendung.
Nach jedem Programmstart muss er die Indizes offenbar nochmal neu aufbauen, was natürlich Zeit kostet.
Standardmäßig scheint er nur den aktuell eingestellten Index aufzubauen, aber sobald ich einen anderen haben will, braucht er wieder so lange, bis es flutscht.
Ist ein Index erst einmal aufgebaut, geht es wirklich sehr schnell, keine Frage, aber wieso schmeißt Delphi alles wieder weg beim Programmende?
Und wieso sind die beim CREATE-DATABASE-Durchlauf nicht schon vorhanden und greifbar?

Das verstehe ich nicht, gebe ich zu!

Oder mache ich einfach irgendetwas völlig falsch?

IndexDefs.Update hilft da übrigens auch nicht weiter

globetrotter77 29. Jan 2009 21:21

Re: ClientDataSet - wie kann man Indizes verwenden?
 
@mkinzler:

wie kann ich denn direkt zugreifen??

omata 29. Jan 2009 21:33

Re: ClientDataSet - wie kann man Indizes verwenden?
 
Müssen den alle Datensätze angezeigt werden? Sortiere doch nicht in deinem Programm, also nicht im ClientDataSet sondern lass die Sortierung von der Datenbank durchführen. Und begrenze die Anzahl der Datensätze.

globetrotter77 29. Jan 2009 21:46

Re: ClientDataSet - wie kann man Indizes verwenden?
 
@omata:

das ist doch genau das Problem, das ich habe!
ich würde diese Arbeit gerne von der Datenbank erledigen lassen, habe aber leider keinen Zugriff auf die Indizes.
Die Datensätze begrenzen geht leider nicht immer, manchmal muss man in einer bestimmten Reihenfolge durchgehen, ob man sie anzeigt oder auch nicht.
Und dazu brauche ich einen passenden Index, den ich genau einmal aufbauen lassen möchte. Danach soll die DB den Index verwalten.

Mir ist schleierhaft, wie du das mit 1 Mio. Sätzen machst, ohne auf dieses Problem zu stoßen.

Harald

mkinzler 29. Jan 2009 21:47

Re: ClientDataSet - wie kann man Indizes verwenden?
 
Warum TClienDataSet?

globetrotter77 29. Jan 2009 21:53

Re: ClientDataSet - wie kann man Indizes verwenden?
 
Zitat:

Zitat von mkinzler
Warum TClienDataSet?

sehr gute Frage!

einfach, weil ich ganz naiv dachte, dass es eine gute Wahl ist ...

insbesondere gefällt mir, dass ich die Datensätze zu definierten Zeitpunkten mit ApplyUpdates sichern kann, auch die Möglichkeit, SavePoints einzurichten, ist nicht schlecht, aber das könnte ich notfalls alles selber stricken, es wäre zumindest nicht so zeitintensiv wie die immer wieder stattfindende Index-Neuerstellung.

Was für Komponenten kämen denn noch in Frage?
Leider benutze ich nur Turbo Delphi Explorer, kann also keine Komponenten direkt installieren, aber zu Fuß scheint das ja trotzdem zu gehen.

mkinzler 29. Jan 2009 21:55

Re: ClientDataSet - wie kann man Indizes verwenden?
 
Disconnected DataSets werden auch von IBDAC, FIBPlus und Ado angeboten

globetrotter77 29. Jan 2009 22:00

Re: ClientDataSet - wie kann man Indizes verwenden?
 
was heißt "Diconnected"?

Bei ADO gab es irgendein anderes Problem, das sich nicht ausmerzen ließ, habe ich schon probiert, ich weiß allerdings nicht mehr genau, was das war.
Ich glaube, man konnte einfach nicht so navigieren, wie ich mir das vorstellte.

Und die anderen beiden?
Darf man die einfach verwenden? Oder kosten die nicht doch ne ganze Stange Geld?
Ich wollte es halt zunächst mal mit Bordmitteln lösen ...

mkinzler 29. Jan 2009 22:04

Re: ClientDataSet - wie kann man Indizes verwenden?
 
Disconnected bedeutet, dass man das DataSet von der Datenbank trennen kann. Die Daten werden dann lokal gecacht. Änderungen können nach der Wiederverbindung auf den Serverbestand übernommen werden

globetrotter77 29. Jan 2009 22:24

Re: ClientDataSet - wie kann man Indizes verwenden?
 
alles jedenfalls sehr mysteriös ...
die BDE ist zwar gnadenlos veraltet, aber die konnte das doch auch schon ... :?

globetrotter77 29. Jan 2009 22:27

Re: ClientDataSet - wie kann man Indizes verwenden?
 
@mkinzler:
dachte ich mir fast ... das heißt, das damit dann auch sowas wie ApplyUpdates möglich ist, oder?

die Frage hatte sich eigentlich erledigt, nachdem du den Schreibfehler ausgebessert hattest.

globetrotter77 29. Jan 2009 22:30

Re: ClientDataSet - wie kann man Indizes verwenden?
 
um nicht missverstanden zu werden:

ich brauche keine Möglichkeit, mich von der DB zu trennen und danach wieder zu verbinden. Meine DB ist nur lokal vorhanden.
Es erscheint mir nur sehr sympathisch, dass die Änderungen nicht gleich in der DB landen, sondern auch stufenweise (und nicht nur im Ganzen) rückgängig gemacht werden können.

globetrotter77 29. Jan 2009 22:44

Re: ClientDataSet - wie kann man Indizes verwenden?
 
um noch mal auf den eigentlichen Kern des Problems zurückzukommen:

1) Wieso schafft es diese ClientDataSet-Komponente nicht, auf die bereits vorhandenen Indizes zuzugreifen? Gibt es da vielleicht einen Work-Around?
2) Wieso wird es in der Hilfe so beschrieben, dass es auch persistente Indizes gibt, die also nicht weggeworfen werden beim Programmende?
Das scheint doch definitiv falsch zu sein, oder?

globetrotter77 29. Jan 2009 22:46

Re: ClientDataSet - wie kann man Indizes verwenden?
 
ach so, fast hätte ich es vergessen: wie schaut es eigentlich mit Queries aus?
wie kann ich sowas nutzen?
Fragen über Fragen ...

Sherlock 30. Jan 2009 07:33

Re: ClientDataSet - wie kann man Indizes verwenden?
 
Also bitte, Schlüssel und Indizes (das ist schon ein bisschen was anderes als ein Schlüssel) werden auf der Tabelle erzeugt, und zwar per SQL, ein DataSet ist eine Abfragekomponente. Die Datenbank inklusive Ihrer Tabellen solltest Du schon per SQL anlegen und ändern, am Besten bevor Du Dich ans programmiern machst.

Ein Link zum Einstieg (ist zwar auf Oracle bezogen, sollte aber helfen): http://www.dba-oracle.com/art_9i_indexing.htm

Sherlock

Thomas F 30. Jan 2009 07:38

Re: ClientDataSet - wie kann man Indizes verwenden?
 
Ich hab in einem Buch über Datenbankprogrammierung ("Datenbankprogrammierung Delphi 5" M.Ebner)
folgendes gefunden:
Zitat:"Im Zeitvergleich zu TTable und BDE schnitt ADO beim Öffnen ein wenig schlechter ab (etwa 280ms zu 240 ms),
beim Aufruf des nächsten Datensatzes lagen die Zeiten gleich (etwa 11ms).
Was jedoch deutlich länger dauert, ist das Öffnen von Datenmengen zu Entwurfszeit.
Auch das Erzeugen von persistenten TField-Instanzen für alle Tabellenspalten wird zur Geduldsprobe."

Scheint tatsächlich langsamer zu sein als mit BDE.

Sherlock 30. Jan 2009 07:50

Re: ClientDataSet - wie kann man Indizes verwenden?
 
OK, dann nach dem Ausflug ins 20. Jahrhundert zurück ins 21. Die BDE ist seit Jahren nicht mehr gepflegt worden, ADO hatte dann doch noch ein paar Jahre Zeit sich zu entwickeln und hat mittlerweile die BDE hinter sich gelassen.

;)

Edith kann mkinzler unter mir nur zustimmen.

Sherlock

mkinzler 30. Jan 2009 08:05

Re: ClientDataSet - wie kann man Indizes verwenden?
 
Wobei DBMS spzifische Komponenten natürlich noch besser sind

globetrotter77 30. Jan 2009 09:07

Re: ClientDataSet - wie kann man Indizes verwenden?
 
Zitat:

Zitat von Sherlock
Also bitte, Schlüssel und Indizes (das ist schon ein bisschen was anderes als ein Schlüssel) werden auf der Tabelle erzeugt, und zwar per SQL, ein DataSet ist eine Abfragekomponente. Die Datenbank inklusive Ihrer Tabellen solltest Du schon per SQL anlegen und ändern, am Besten bevor Du Dich ans programmiern machst.

Ein Link zum Einstieg (ist zwar auf Oracle bezogen, sollte aber helfen): http://www.dba-oracle.com/art_9i_indexing.htm

Sherlock

mein lieber Sherlock,

was ein Dataset ist, weiß ich sehr wohl, und wie man per SQL eine Datenbank anlegt, ebenfalls.
Wenn du mal genauer nachliest, wirst du vielleicht feststellen, dass ich genau das gemacht habe bzw. machen will, und zwar, bevor ich mich ans Programmieren mache.
Es ist aber offenbar so, dass ich auf die von mir auf der Tabelle erzeugten Indizes nicht ansprechen kann.

Die Beschreibung, wie Oracle das intern organisiert, ist an dieser Stelle völlig uninteressant, da der Index einfach nicht erreichbar ist.

Ich dachte eben, dass es vielleicht doch einen Work-Around geben könnte, an einen real existierenden Index ranzukommen, weil sonst ja ein ganz wesentlicher Teil der Datenbank-Intelligenz verloren geht.
Da scheint aber leider niemand eine Lösung zu kennen.

Schade!

Sherlock 30. Jan 2009 09:13

Re: ClientDataSet - wie kann man Indizes verwenden?
 
Ein Index funktioniert doch aber automatisch. Dafür ist er da. Du musst nach dem korrekten anlegen des Index nixhts mehr damit machen, die abfragen laufen dann ganz von alleine schneller. Und da liegt dann auch die wahre Intelligenz eines RDBMS, das Du nämlich eben nicht selber Indizes abfragen musst ;)

http://de.wikipedia.org/wiki/Datenbankindex

Sherlock

mkinzler 30. Jan 2009 09:32

Re: ClientDataSet - wie kann man Indizes verwenden?
 
@Sherlock: Sein Problem scheint es zu sein das die Indizes des Provider-DataSets nicht automatisch in das ClientDataSet übernommen werden

globetrotter77 30. Jan 2009 09:34

Re: ClientDataSet - wie kann man Indizes verwenden?
 
Zitat:

Zitat von Sherlock
Ein Index funktioniert doch aber automatisch. Dafür ist er da. Du musst nach dem korrekten anlegen des Index nixhts mehr damit machen, die abfragen laufen dann ganz von alleine schneller.

http://de.wikipedia.org/wiki/Datenbankindex

Sherlock

Schön wär's!

Genau das hätte ich erwartet, aber es ist leider nicht so!
Das scheint aber ein Problem der ClientDataSet-Komponente zu sein.
Extern definierte Indizes sind einfach nicht greifbar, warum auch immer.

Einfach mal ausprobieren:
CREATE DATABASE xxx ...
CREATE TABLE yyy ...
CREATE INDEX zzz on yyy (spalte)
...

(geht mit jedem SQL-Tool auf die eine oder andere Art und Weise)

Danach neues Projekt erstellen, TSQLConnection, TSQLDataSet, TDataSetProvider, TClientDataSet anlegen und verfügbare Indizes über IndexDefs anzeigen.
Da findet sich aber nichts außer DEFAULT_ORDER und CHANGEINDEX, und die haben eine völlig andere Bedeutung.
Nun würde es mir ja nichts ausmachen, wenn ich das genau einmal aus meinem Programm herausmachen müsste, aber das ist eben auch nicht der Fall.
Stattdessen erzeugt die Komponente bei jedem Öffnen den aktuell eingestellten Index wieder neu.

Und das dauert einfach recht lange, wenn genügend Datensätze vorhanden sind ... ist ja klar!
Bei 1000 oder 10000 Sätzen fällt das zunächst mal gar nicht auf ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:22 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz