Delphi-PRAXiS
Seite 6 von 7   « Erste     456 7      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Firebird Import aus Textdatei extrem langsam (https://www.delphipraxis.net/140213-firebird-import-aus-textdatei-extrem-langsam.html)

mkinzler 16. Sep 2009 12:30

Re: Firebird Import aus Textdatei extrem langsam
 
Zitat:

Keine prepared Queries weil das Ganze nur einmal läuft.
Aber wohl mehrere Datensätze, oder?

hoika 16. Sep 2009 14:02

Re: Firebird Import aus Textdatei extrem langsam
 
Halo,

also ich gehe ohne SQL-Monitor nicht aus dem Haus.

Ausserdem:
Wenn es eine einmalige Sache ist, sch** auf die Zeit ;)


Heiko

omata 16. Sep 2009 20:18

Re: Firebird Import aus Textdatei extrem langsam
 
Liste der Anhänge anzeigen (Anzahl: 1)
So ich habe mich jetzt nochmal dran versucht.

Zitat:

Zitat von globetrotter77
Zitat:

Zitat von omata
So, ich habe das jetzt mal selber ausprobiert...
Code:
1.000.000   Zeilen = 0:18 (Datei = 16MB)
1.000.000.0 Zeilen = 2:48 (Datei = 166MB)

da komme ich noch lange nicht ran ...

Ich muss meine Aussage leider etwas korrigieren...

Zitat:

Zitat von globetrotter77
Ca. 105000 Datensätze in knapp 4 Minuten

Ich schaffe immerhin 1000000 Datensätze (Datenvolumen von 60MB) in 4 Minuten (siehe Anhang).

Die Zeiten die ich oben angegeben hatte, hatte ich mit FlameRobin ausprobiert und eben nicht in Delphi. Das sollte eigentlich auch kein Problem darstellen, allerdings darf für meinen Vorschlag die Option "ExternalFileAccess" nicht auf None stehen. Dies ist die Voreinstellung und kann über die firebird.conf geändert bzw. überschrieben werden. Mit FlameRobin funktioniert das auch, aber eben leider nicht, wenn man selber aus Delphi heraus auf Firebird (Emmbedded) zugreift (vielleicht kann mir ja einer verraten wie das geht).
Deshalb konnte ich leider nicht meinen ersten Vorschlag umsetzen.


Zitat:

Zitat von globetrotter77
hast du auch doppelte Primary Keys dabei?
die muss ich nämlich berücksichtigen

Nein, diesen Sonderfall habe ich jetzt noch nicht betrachtet.

hoika 17. Sep 2009 03:10

Re: Firebird Import aus Textdatei extrem langsam
 
Hallo,

Also

Delphi-Quellcode:
SQLDataSet.ExecSQL;
Application.ProcessMessages;
du rufst nach jedem Insert Application.ProcessMessages; auf.

Ich würde das ändern in

Delphi-Quellcode:
if (FZeile mod 100) then
begin
  Application.ProcessMessages;
end;
Da du ja hier eh einen Zähler (Fzeile) hast,
könnte man auch den Tip mit Commit/StartTransaction einbauen


Delphi-Quellcode:
if (FZeile mod 100) then
begin
  SQLConnection.Commit(TD);
  SQLConnection.StartTransaction(TD);
end;
Zusammen also wie folgt:

Delphi-Quellcode:
if (FZeile mod 100) then
begin
  Application.ProcessMessages;
end;

if (FZeile mod 100) then
begin
  SQLConnection.Commit(TD);
  SQLConnection.StartTransaction(TD);
end;
Ich würde es so wie hier getrennt lassen,
dann kann man am mod X noch rumspielen.


Zitat:

Firebird (Emmbedded)
Dazu muss einfach die FBClient.DLL ausgetauscht werden,
das Programm sollte im Idealfall davon gar nix mitbekommen.

Exe -> FBClient(SQL-Server) -> SQL-Server
Exe -> FBClient(Embedded)

Die embedded-Variante der FBClient-Dll implementiert den SQL-Server
selber und reicht die Befehle nicht weiter wie die normale DLL.

Zusätzlich müssen noch ein paar Dateien in ein Unterverzeichnis,
Infos dazu hier (Suche) oder einfach mal Frau Google fragen.


Heiko

IBExpert 17. Sep 2009 08:19

Re: Firebird Import aus Textdatei extrem langsam
 
und wenn du deinen import noch mal richtig beschleunigen willst, dann bau in deinem Delphi Programm deine Textdatei auf ein fixedformat um (also pro spalte eine feste anzahl an zeichen, nicht genutzte mit Leerzeichen auffüllen). Danach schaust du dir die Deaklaration eines external files in Firebird an (geht in IBExpert mit einem assisetnten im Table editor, wichtig: in der Firebird conf vorher ein directory für external files freigeben.

im sql editor geht das auch direkt

create table imp external file 'C:\imp.txt'
(ID CHAR(18),
TXT1 CHAR(80),
TXT2 CHAR(80),
TXT3 CHAR(80),
CRLF CHAR(2))

usw, dann kannst du mit "insert into tabx select * from imp" extrem schnell daten importieren, je nach hardware durchaus bis 100.000 records pro sekunde!

alternativ ab fb2 einfach dein SQL mit

execute block
as
insert .....;
insert .....;
insert .....;
.....
insert .....;
insert .....;
end

aufbauen, damit gehen mehrere Inserts pro sql

aber immer wichtig: aktive Transaktionssteuerung

omata 17. Sep 2009 11:46

Re: Firebird Import aus Textdatei extrem langsam
 
Zitat:

Zitat von hoika
du rufst nach jedem Insert Application.ProcessMessages; auf.

Ich würde das ändern

Das hatte ich getestet und das brachte keine zeitliche Verbesserung.

Zitat:

Zitat von hoika
Da du ja hier eh einen Zähler (Fzeile) hast,
könnte man auch den Tip mit Commit/StartTransaction einbauen

Hast du das mal ausprobiert, ich könnte mir vorstellen, dass das gar nichts bringt.

Zitat:

Zitat von hoika
Dazu muss einfach die FBClient.DLL ausgetauscht werden,
das Programm sollte im Idealfall davon gar nix mitbekommen.

Die embedded-Variante der FBClient-Dll implementiert den SQL-Server
selber und reicht die Befehle nicht weiter wie die normale DLL.

Hast du mal in mein Archiv geschaut, da sind alle möglichen, benötigten DLLs drin. Ich hatte auch geschrieben, dass ich das mit FlameRobin ausprobiert hatte, die selbe DLL und auch im Embedded-Modus.

Zitat:

Zitat von hoika
Zusätzlich müssen noch ein paar Dateien in ein Unterverzeichnis,
Infos dazu hier (Suche) oder einfach mal Frau Google fragen.

Ja wunderbar, selbst wird man mal konkret und erhält nur nicht getestete "womöglich Vorschläge".

Zitat:

Zitat von IBExpert
und wenn du deinen import noch mal richtig beschleunigen willst, dann bau in deinem Delphi Programm deine Textdatei auf ein fixedformat um (also pro spalte eine feste anzahl an zeichen, nicht genutzte mit Leerzeichen auffüllen). Danach schaust du dir die Deaklaration eines external files in Firebird an (geht in IBExpert mit einem assisetnten im Table editor, wichtig: in der Firebird conf vorher ein directory für external files freigeben.

Genau das war meine erste beschriebene Idee, die (wie ebenfalls geschrieben) mit FlameRobin zu den oben erwähnten Zeiten kommt, aber eben leider nicht aus Delphi heraus funktioniert.

Was soll das? Habt ihr auch mal gelesen, was ich geschrieben habe? Habt ihr auch mal eure Vorschläge ausprobiert? Ich versuche hier zu helfen, in diesem Fall mal wieder mit einem konkreten Beispiel, wie wäre mit konkreten Vorschlagen/Erweiterungen/Verbesserungen und eigenen Tests.

Wenn man das so ließt, meint ihr wohl, ich bin da der totale Volldepp. (Eben nicht! ich bin der, der es ausprobiert hat!)

Und da ihr ja alle so schlau seit, werde ich jetzt nichts mehr zum Thema sagen.

IBExpert 17. Sep 2009 12:42

Re: Firebird Import aus Textdatei extrem langsam
 
warum sollte ein create table mit external file aus delphi heraus nicht funktionieren? das mach ich andauernd.
Das external file sollte immer eine temporäre tabelle sein, die dann z.B. via "update or insert" oder stored
proc in die reale tabelle übertragen wird.

Ich will keineswegs deine Postings kritisieren und das man den einen oder anderen Eintrag 4 seiten vorher
mal übersieht ist ja auch möglich oder? Von volldeppen spricht hier keiner, ich jedenfalls nicht.
nicht jeder Input aus diesem Forum hat den Anspruch 100% sauberen kompilierbaren code zu liefern, weil nicht
jeder die zeit dazu hat, das für jede Anfrage umzusetzen. Wenn du das zu jedem deiner Postings machst finde ich
das sehr lobenswert.

das nur dazu, und meinen Hinweis auf execute block ist auch problemlos innerhalb von Delphi benutzbar, jedenfalls
mit brauchbaren aktuellen Zugriffskomponenten.

mkinzler 17. Sep 2009 12:54

Re: Firebird Import aus Textdatei extrem langsam
 
Zitat:

warum sollte ein create table mit external file aus delphi heraus nicht funktionieren?
IBExpert ist ja wohl auch in Delphi erstellt worden.

IBExpert 17. Sep 2009 13:17

Re: Firebird Import aus Textdatei extrem langsam
 
Zitat:

Zitat von mkinzler
Zitat:

warum sollte ein create table mit external file aus delphi heraus nicht funktionieren?
IBExpert ist ja wohl auch in Delphi erstellt worden.

sehr guter Hinweis, danke, warum bin ich denn da nicht drauf gekommen :spin2:

omata 17. Sep 2009 13:43

Re: Firebird Import aus Textdatei extrem langsam
 
Zitat:

Zitat von omata
... Das sollte eigentlich auch kein Problem darstellen, allerdings darf für meinen Vorschlag die Option "ExternalFileAccess" nicht auf None stehen. Dies ist die Voreinstellung und kann über die firebird.conf geändert bzw. überschrieben werden. Mit FlameRobin funktioniert das auch, aber eben leider nicht, wenn man selber aus Delphi heraus auf Firebird (Emmbedded) zugreift (vielleicht kann mir ja einer verraten wie das geht).

Wer lesen kann ist klar im Vorteil...

Zusatz: Zugriff über DBExpress (so wie der TE auf die DB zugreift)

Darauf wird natürlich mit keiner einzigen Silbe mal eingegangen, echt bedauerlich.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:51 Uhr.
Seite 6 von 7   « Erste     456 7      

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