Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   TFDTable.FindKey - Performance (https://www.delphipraxis.net/208848-tfdtable-findkey-performance.html)

Edelfix 21. Sep 2021 15:01

Datenbank: ADS • Version: 12 • Zugriff über: FireDac

TFDTable.FindKey - Performance
 
Hallo,

ich bin dabei von ADS Komponenten auf FireDac zu wechseln.

Etwas scheint aber nicht richtig zu sein. Es ist sehr langsam mit FireDac.

In einer Start Unit werden etwa 150-mal hinter einander per FindKey Werte gelesen und in einen Rekord gespeichert.

Mit ADS Komponenten geht das in 172 m/sec. (mit GetTickCount gemessen).

Das gleiche mit FireDac braucht 2218 m/sec.

Mit dem FireDac Monitor sehe ich das während dieser Zeit kein Datenbank Zugriff erfolgt. Das bedeutet das die Komponente diese Aufgabe mit internen Daten erledigt.
Leider weiß ich nicht ob die ADS Komponente für jeden FindKey Aufruf auf die Datenbank zugreift.

Jemand eine Idee?

Sinspin 21. Sep 2021 16:44

AW: TFDTable.FindKey - Performance
 
Zitat:

Zitat von Edelfix (Beitrag 1495198)
ich bin dabei von ADS Komponenten auf FireDac zu wechseln.

Genau das gleiche habe ich vor ein paar Monaten auch gemacht.
FD ist schneller, obwohl ja intern auf den gleichen Treiber zugegriffen wird.
Nur auf ein paar Sachen solltest Du verzichten.
Zum Beispiel auf Locate und FindKey. Die werden nun beide Clientseitig ausgeführt und nicht mehr auf dem Server. Es wird also alles geladen und dabei sortiert.

Zitat:

Zitat von Edelfix (Beitrag 1495198)
In einer Start Unit werden etwa 150-mal hinter einander per FindKey Werte gelesen und in einen Rekord gespeichert.

Das ist auch kein wirklich toller Programmierstiel. Das Sollte eine SP auf dem Server machen und dir danach alle Werte liefern.

Edelfix 21. Sep 2021 17:41

AW: TFDTable.FindKey - Performance
 
Das ist ja ein heftiger Unterschied zu ADS Komponenten. In unserem Projekt werden massive TAdsTable eingesetzt. Habe eben 1800 Stellen mit FindKey gefunden.

Wie kann man einer TFDTable beibringen das sie den Server nutzen soll?

Sinspin 22. Sep 2021 08:47

AW: TFDTable.FindKey - Performance
 
Ich habe große Mengen von TADSTable durch queries ersetzt und ziehe nur noch die Daten die wirklich gebraucht werden.

Table kommt bei mir nur noch zum Einsatz bei kleinen Tabellen, wo es egal ist ob alles gezogen wird, oder es eh Sinn macht.
Ich hatte früher das gleiche Problem. Und TADSQuery hatte einen Master/Detail Bug. Den habe ich schon vor Jahren behoben um die Komponente besser nutzen zu können.
FindKey hatte bei Queries unter ADS auch seine Probleme. Habe ich dort nie verwendet.

Master / Detail funktioniert bei FireDac wirklich gut.
Ich arbeite mit Parametern in den Scripten die FD dann selber für Master / Detail auswertet.

Beim Umstieg habe ich tausende Locate ersetzen müssen. Meißt durch direkte query Zugriffe um nur ein paar Werte zu hohlen oder zu ändern.
Viel arbeit war das schon (gut 2 Monate für 500K LOC), aber es lohnt sich. Es läuft nun alles Flotter.
Allerdings habe ich schon vorher über Jahre hinweg, halt immer wenn zeit war, so gut wie alle Änderungen die via Table gemacht wurden durch Update Scripte ersetzt.

Zitat:

Zitat von Edelfix (Beitrag 1495213)
Habe eben 1800 Stellen mit FindKey gefunden.

Aus meiner Sicht schlechter Programmierstiel:wink:. Datenbankzugriffe sind immer Teuer. Also sparsam damit sein.

Pfaffe 22. Sep 2021 09:22

AW: TFDTable.FindKey - Performance
 
>> TADSQuery hatte einen Master/Detail Bug
In welcher Version.
Bitte um mehr Info. Was ist das für eine Bug?

Sinspin 22. Sep 2021 10:04

AW: TFDTable.FindKey - Performance
 
Eigentlich beide, also TADSTable und TADSQuery. Ich denke nicht das sich daran was geändert hat. Aber in 10 und 11 war es jedenfalls so.

Ich hatte da lange Debatten drüber. ADS stellte das Verhalten als Feature dar.
Ich sehe allerdings kein Feature in der Tatsache dass ein offenes Detail alle Records zur Verfügung stellt wenn die Mastersource zu ist. Erwarten würde ich dann dass auch das Detail keine Records enthält, weil ja nicht bekannt ist wie gefiltert werden soll.

Bei FD geht das korrekt. Detail srcipt like : "SELECT * FROM DetailTable WHERE Field = :MasterField". Ist die Mastertabelle zu, ist MasterField unbestimmt und das Detail is leer.

Edelfix 22. Sep 2021 14:31

AW: TFDTable.FindKey - Performance
 
Zitat:

Das Sollte eine SP auf dem Server machen und dir danach alle Werte liefern.
Was ist mit SP gemeint?

Sinspin 22. Sep 2021 14:49

AW: TFDTable.FindKey - Performance
 
Sorry, _S_tored _P_rocedure.

Edelfix 23. Sep 2021 08:00

AW: TFDTable.FindKey - Performance
 
Wie geht der Trick?

Wenn ich ein Rekord habe der z.B. „Optionen“ heißt.
Dieser hat 150 Werte (Integer, Boolean, String) die aus der Datenbank gelesen werden.
Wie kann da SP helfen?

DeddyH 23. Sep 2021 09:33

AW: TFDTable.FindKey - Performance
 
Die SP liefert Dir alle Werte auf einmal (wobei 150 davon schon harter Tobak sind), so dass man nur eine Abfrage benötigt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:26 Uhr.
Seite 1 von 2  1 2   

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