Delphi-PRAXiS
Seite 2 von 7     12 34     Letzte »    

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)

omata 14. Sep 2009 00:57

Re: Firebird Import aus Textdatei extrem langsam
 
Zitat:

Zitat von globetrotter77
macht keinen Unterschied, jedenfalls nicht, was die Laufzeit angeht

...das ist klar, ist trotzdem der schönere und auch sicherere Weg.

Zitat:

Zitat von globetrotter77
...aber ich muss die doppelten Schlüssel zumindest protokollieren, daher ist eine Einzelsatzbearbeitung leider erforderlich...

Wenn du die Daten erstmal in der Datenbank hast, ist die Prüfung auf doppelte Einträge doch super einfach. Das Protokollieren muss doch nicht unbedingt beim Einfügen geschehen. Dieser Weg ist doch viel flexibler und die Daten können dann leichter weiterverarbeitet werden.

globetrotter77 14. Sep 2009 01:07

Re: Firebird Import aus Textdatei extrem langsam
 
Zitat:

Zitat von omata
Wenn du die Daten erstmal in der Datenbank hast, ist die Prüfung auf doppelte Einträge doch super einfach. Das Protokollieren muss doch nicht unbedingt beim Einfügen geschehen. Dieser Weg ist doch viel flexibler und die Daten können dann leichter weiterverarbeitet werden.

wieso ist das dann super einfach?
wie meinst du das?

omata 14. Sep 2009 01:11

Re: Firebird Import aus Textdatei extrem langsam
 
Wenn die Daten in der Datenbank sind, kannst du sie doch wesentlich einfacher per SQL formen, weiterverarbeiten und analysieren, als wenn du alles selber programmieren musst. Der Aufwand entfällt dann und du kannst alles über einfaches SQL lösen.

omata 14. Sep 2009 02:21

Re: Firebird Import aus Textdatei extrem langsam
 
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)
Also für einen Datensatz ca. 18µs (auf meiner Maschine = P4, 3GHz)

mjustin 14. Sep 2009 06:17

Re: Firebird Import aus Textdatei extrem langsam
 
Delphi-Quellcode:
       
        with DM_User.SQLQueryTemp do
        begin
          with SQL do
          begin
            Clear;
            Add(sqltxt);
          end;
          ExecSQL(true);
        end;
Ich würde die Query nur einmal zu Beginn des Einlesens erzeugen und den SQL-Text zuweisen, dabei dann mit Parametern arbeiten:
SQL-Code:
insert into tabelle(f1, f2, f3, ...) values (:f1, :f2, :f3, ...)
In der Einleseschleife dann die Parameter zuweisen und ExecSQL aufrufen. Vorteil: die Query wird vom Server nur einmal erzeugt und dann für jedes Insert wiederverwendet. ("Prepared Statement").

Eventuell hilft es auch noch, die ganze Sache in einer Transaktion laufen zu lassen.

Viele Grüße,

mkinzler 14. Sep 2009 06:43

Re: Firebird Import aus Textdatei extrem langsam
 
Und eine explizite Transaktionssteuerung verwenden. Denn sonst wird dank autocommit jeder Insert insert in eine eigene Transkation gepackt.

globetrotter77 14. Sep 2009 09:04

Re: Firebird Import aus Textdatei extrem langsam
 
Zitat:

Zitat von mkinzler
Und eine explizite Transaktionssteuerung verwenden. Denn sonst wird dank autocommit jeder Insert insert in eine eigene Transkation gepackt.

Aha! Das könnte natürlich ein Problem sein!
und wie macht man das mit der expliziten Transaktionssteuerung?

mkinzler 14. Sep 2009 09:15

Re: Firebird Import aus Textdatei extrem langsam
 
Mit dbExpress kenne ich mich nicht aus, aber versuche mal
SQLConnection.StartTransaction() und SQLConnection.Commit()

globetrotter77 14. Sep 2009 09:31

Re: Firebird Import aus Textdatei extrem langsam
 
StartTransaction erwartet einen "benutzerdefinierten Transaktionsbezeichner" - was ist denn damit gemeint??
und wie macht man das?

globetrotter77 14. Sep 2009 09:36

Re: Firebird Import aus Textdatei extrem langsam
 
Zitat:

Zitat von mjustin
Ich würde die Query nur einmal zu Beginn des Einlesens erzeugen und den SQL-Text zuweisen, dabei dann mit Parametern arbeiten:
SQL-Code:
insert into tabelle(f1, f2, f3, ...) values (:f1, :f2, :f3, ...)
In der Einleseschleife dann die Parameter zuweisen und ExecSQL aufrufen. Vorteil: die Query wird vom Server nur einmal erzeugt und dann für jedes Insert wiederverwendet. ("Prepared Statement").

Bin schon ganz meschugge ...
wie war das nochmal mit den Params?
wie ordne ich denen Werte zu?
geht das mit
Delphi-Quellcode:
SQLQuery.Params[0].Value:='blabla';
und muss ich das Prepare selbst auslösen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:10 Uhr.
Seite 2 von 7     12 34     Letzte »    

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