AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken FireDAC: Viele Records einfügen dauert ziemlich lange
Thema durchsuchen
Ansicht
Themen-Optionen

FireDAC: Viele Records einfügen dauert ziemlich lange

Ein Thema von Der schöne Günther · begonnen am 10. Dez 2015 · letzter Beitrag vom 10. Dez 2015
Antwort Antwort
Der schöne Günther

Registriert seit: 6. Mär 2013
6.190 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

AW: FireDAC: Viele Records einfügen dauert ziemlich lange

  Alt 10. Dez 2015, 11:13
Falls auf dem FK ein Index liegt, den solange deaktivieren datenbankseitig, sonst hast Du nicht nur 50T inserts, sondern das gleiche nochmal beim Index.
Ja, tut es. Warum? Keine Ahnung. Ich verstehe nicht mal wirklich was das ist, ich denke mal, das hilft ihm bei SELECT-Statements den Kram schneller zu finden.

Mit der Lese-Dauer bin ich übrigens sehr zufrieden, Löschen dauert deutlich länger, ist aber auch noch akzeptabel. Nur Hinzufügen ist echt schlimm...


Eins verstehe ich nicht: Warum redet Ihr fast alle von einer Query? Es ist eine Tabelle, TFdTable.


"Alles umschmeißen, anderes DMBS nehmen" wollte ich jetzt am wenigsten hören


DisableControls, falls Du Anzeigekomponenten verbunden hast.
Das übernimmt schon Begin/EndBatch()
Zitat:
Mit der Methode BeginBatch können Sie ressourcenaufwendige Operationen deaktivieren und die Datenmenge so einrichten, dass Aktualisierungen mit maximaler Ausführungsgeschwindigkeit ausgeführt werden. Der Aufruf von BeginBatch deaktiviert:
Die Aktualisierung von datensensitiven Steuerelementen.
Die Aktualisierung von Einschränkungen.
Die Wartung von Aggregaten.
Das Anzeigen von Wartecursors.
Die ähnlich ressourcenaufwendige Verarbeitung in DatS-Objekten, die nicht durch APIs der Datenmenge gesteuert wird.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.428 Beiträge
 
Delphi 12 Athens
 
#2

AW: FireDAC: Viele Records einfügen dauert ziemlich lange

  Alt 10. Dez 2015, 11:16
Zitat:
"Alles umschmeißen, anderes DMBS nehmen" wollte ich jetzt am wenigsten hören
Nö...so war das nicht gemeint. Nur der Hinweis auf die Blöcke. Ansonsten ist das ganze ja vergleichbar...
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: FireDAC: Viele Records einfügen dauert ziemlich lange

  Alt 10. Dez 2015, 11:30
Die FDTable ist eine Kompatibilitäts-Komponente für diejenigen, die von der BDE kommen. Intern werkelt eine - mehr oder weniger speziell konfigurierte - Query.
Wenn es nur um Insert-Statements geht, kannst Du auch ein FDCommand nutzen, welches eine sehr schlanke Komponente für SQLs ohne Ergebnismenge ist.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#4

AW: FireDAC: Viele Records einfügen dauert ziemlich lange

  Alt 10. Dez 2015, 11:32
Falls auf dem FK ein Index liegt, den solange deaktivieren datenbankseitig, sonst hast Du nicht nur 50T inserts, sondern das gleiche nochmal beim Index.
Ja, tut es. Warum? Keine Ahnung. Ich verstehe nicht mal wirklich was das ist, ich denke mal, das hilft ihm bei SELECT-Statements den Kram schneller zu finden.

Eins verstehe ich nicht: Warum redet Ihr fast alle von einer Query? Es ist eine Tabelle, TFdTable.
So soll das ja sein ein Index auf Fremdschlüsselfelder, alles gut.
Bei massiven Datenbewegungen (Insert oder Update) auf dem Schlüsselfeld ist der Index leider kontraproduktiv, er ist hauptsächlich eine Hilfe beim schnellen Select.
Der Vorschlag ist aber eher was für den Fall, dass Du mit Delphi Bordmitteln nicht so schnell wirst, wie Du möchtest.

Es reden alle von Query, weil da vermutlich die Erfahrung raus spricht, dass ein Dataset/Table für sowas nicht so geeignet ist.

Mach Dir ein Query Komponente aufs Formular, schreib das Insert Statement rein (parametriert) und fülle die Parameter aus Deinem Memdataset.
Das dann in eine Schleife und Du wirst es wahrscheinlich verstehen, woher die Empfehlung kommt.
Das Queryobjekt oder ein Command schickt einfach die Daten zum Server. Es gibt nahezu kein Overhead im Handling. Das ist beim Dataset eben etwas anders.
Gruß, Jo
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.190 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: FireDAC: Viele Records einfügen dauert ziemlich lange

  Alt 10. Dez 2015, 11:37
Der goldene Weg ist es sicher nicht, aber ich habe statt
Delphi-Quellcode:
meinDataset.Append();
[...]
meinDateSet.Post();
nun mal gesagt

meinDataSet.ExecSQL(sqlString, [param1, param2, param3]);
und es ist schon mal 50% schneller. Die Tabellenkomponente benutze ich tatsächlich auch nur zum Einfügen. Hm...
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: FireDAC: Viele Records einfügen dauert ziemlich lange

  Alt 10. Dez 2015, 11:48
Da könntest Du auch das ExecSQL der Connection nutzen. Wenn Dir das langt, sparst Du Dir die zusätzliche Komponente.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.190 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: FireDAC: Viele Records einfügen dauert ziemlich lange

  Alt 10. Dez 2015, 11:52
Habe ich grade versucht, das spart auch etwas, ist aber kein bedeutender Unterschied. Zwei Sekunden für 20.000 Records ist immer noch ziemlich hart. Ich schaue mal ob ich mit dem Index irgendwie etwas machen kann...
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.428 Beiträge
 
Delphi 12 Athens
 
#8

AW: FireDAC: Viele Records einfügen dauert ziemlich lange

  Alt 10. Dez 2015, 12:02
Zitat:
und es ist schon mal 50% schneller
...das meinte ich mit direktem SQL... Deine Anzahl an Inserts reicht an Masseninserts heran. Wieviele "Durchläufe" deiner 50000 Inserts sind im Laufe eines Jahres zu erwarten? Ggf. mußt du dir auch über die Datenmenge im Gesamten Gedanken machen...
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: FireDAC: Viele Records einfügen dauert ziemlich lange

  Alt 10. Dez 2015, 12:04
Der Standardweg sollte immer so ablaufen:
Delphi-Quellcode:
Connection.StartTransaction;
try

  // Viele Datensätze einfügen
  for idx := 1 to 30000 do
  begin
    ...
    Connection.ExecSQL(sqlString, [param1, param2, param3]);
  end;

  Connection.Commit;
except
  Connection.Rollback;
  raise;
end;
Schneller sind dann nur noch BULK INSERTS
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.190 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: FireDAC: Viele Records einfügen dauert ziemlich lange

  Alt 10. Dez 2015, 12:07
Wieviele "Durchläufe" deiner 50000 Inserts sind im Laufe eines Jahres zu erwarten?
Bis zu ein, zwei Dutzend täglich
Aber 50.000 ist ein Extremfall, ich rechne im Schnitt eher mit einem Zehntel der Menge.

Der Standardweg sollte immer so ablaufen:
Tut er
Nur meine Advantage-Datenbank ist die lokale Freeware-Version und hat keine Transaktionen, da sind das nur leere Dummies. Der Monster-Zeitanteil geht wahrscheinlich tatsächlich dafür drauf dass er nach jedem Record schaut ob die referentielle Integrität beim FKEY noch gegeben ist. Würde er das einmal am Schluss machen wäre es bestimmt schneller. Ach ja ...
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz