Delphi-PRAXiS
Seite 1 von 7  1 23     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)

globetrotter77 13. Sep 2009 22:16

Datenbank: Firebird embedded • Version: 2.1 • Zugriff über: per TSQLQuery

Firebird Import aus Textdatei extrem langsam
 
Hallo zusammen!

Ich habe ein massives Problem beim Import von Daten aus einer Textdatei in eine Firebird-DB.
Die Laufzeit ist schlicht und einfach katastrophal.
Für je 100 Datensätze mit gerade mal 5 lumpigen Textfeldern benötigt das Programm ca. 1 Sekunde.
Macht bei ca. 110000 Datensätzen also 1100 Sekunden bzw. fast 20 Minuten.
Das Lesen der Daten inkl. Split der einzutragenden Felder sowie Aufbau eines passenden INSERT-Statements benötigt gerade mal 32 Sekunden.
Die gesamte Zeit scheint daher alleine von einem einzigen SQL-Statement pro Satz aufgefressen zu werden.
Woran kann das liegen?
Wäre für jede Idee dankbar ...

Gruß

globetrotter77

globetrotter77 13. Sep 2009 22:37

Re: Firebird Import aus Textdatei extrem langsam
 
oder ist das etwa normal, dass es so lange dauert?
liegt es an Firebird oder an der TSQLQuery-Komponente?
in der vorherigen Version habe ich noch mit der leider ja hoffnungslos veralteten BDE gearbeitet und durchaus vernünftige Laufzeiten erreicht.

hat jemand Erfahrung mit Datenimport in Firebird?
wie macht man's geschickterweise? und richtig schnell?

Hansa 14. Sep 2009 00:04

Re: Firebird Import aus Textdatei extrem langsam
 
Was ist TSqlQuery ? :shock: Faktor 10-100 ist allerdings nicht ungewöhnlich, sofern WinApi Funktionen verwendet werden. Memo, Listbox, Stringgrid etc. Die Aktualisierung / Anzeige dauert da ewig. 8)

globetrotter77 14. Sep 2009 00:13

Re: Firebird Import aus Textdatei extrem langsam
 
ist schon klar, dass manche Funktionen ewig dauern, aber bei ist der Unterschied tatsächlich reduzierbar auf die Ein-/Ausblendung von
Delphi-Quellcode:
       
        with DM_User.SQLQueryTemp do
        begin
          with SQL do
          begin
            Clear;
            Add(sqltxt);
          end;
          ExecSQL(true);
        end;
Gibt es eine andere Komponente, mit der man direkte SQL-Statements abgeben kann?
Ich gebe zu, dass ich mich da nicht besonders auskenne ... habe früher immer die BDE und Paradox benutzt und war eigentlich immer zufrieden ... nachdem die aber mittlerweile so richtig veraltet ist, wollte ich mal anders rangehen ... leider nur mit mässigem Erfolg

Hansa 14. Sep 2009 00:27

Re: Firebird Import aus Textdatei extrem langsam
 
Kombination von Clear und Add ist schon gut. :mrgreen:

omata 14. Sep 2009 00:31

Re: Firebird Import aus Textdatei extrem langsam
 
Vielleicht hilft dir ja...
Code:
CREATE TABLE tabelle EXTERNAL FILE 'file.txt' (...);
weiter.

Add: Oder du baust dir ein SQL-Statement, dass alle INSERTs auf einmal durchführt...
SQL-Code:
INSERT INTO tabelle
SELECT FIRST 1 feld1, feld2, ... FROM tabelle
UNION
SELECT FIRST 1 feld1, feld2, ... FROM tabelle
:
:

globetrotter77 14. Sep 2009 00:38

Re: Firebird Import aus Textdatei extrem langsam
 
über external file habe ich auch schon nachgedacht, aber ich habe das Problem, dass ich davon ausgehen muss, dass doppelte Schlüssel vorkommen ... wie geht der Import via external file damit um?
im Augenblick löse ich das durch ein try-except-Konstrukt ...
und wie definiere ich in einem external file Datumswerte?
hat jemand Erfahrung?

globetrotter77 14. Sep 2009 00:41

Re: Firebird Import aus Textdatei extrem langsam
 
Zitat:

Zitat von omata
Add: Oder du baust dir ein SQL-Statement, dass alle INSERTs auf einmal durchführt...
SQL-Code:
INSERT INTO tabelle
SELECT FIRST 1 feld1, feld2, ... FROM tabelle
UNION
SELECT FIRST 1 feld1, feld2, ... FROM tabelle
:
:

wie gesagt, ich habe eine Textdatei und keine Tabelle

omata 14. Sep 2009 00:45

Re: Firebird Import aus Textdatei extrem langsam
 
Zitat:

Zitat von Hansa
Kombination von Clear und Add ist schon gut. :mrgreen:

blödsinn...

Mach es so...
Delphi-Quellcode:
  SQLQueryTemp.SQL.Text:=sqltxt;
  SQLQueryTemp.ExecSQL(true);
Zitat:

Zitat von globetrotter77
...ich habe das Problem, dass ich davon ausgehen muss, dass doppelte Schlüssel vorkommen...

Lege die Tabelle ohne Primärschlüssel an...
SQL-Code:
CREATE TABLE tabelle EXTERNAL FILE 'file.txt' (feld1 INT, feld2 CHAR(10));
...und mache danach einen Import in eine andere Tabelle...
SQL-Code:
INSERT INTO richtige_tabelle
SELECT DISTINCT feld1, TRIM(feld2)
FROM tabelle
Da hier die Feldinhalte eine konstante Größe (mit Leerzeichen gefüllt) haben müssen, kannst du in diesem Schritt auch gleich die Zeichenketten trimmen.

Zitat:

Zitat von globetrotter77
wie gesagt, ich habe eine Textdatei und keine Tabelle

Das ist mir bewusst, du sollst ja auch das Statement zusammenbauen, der FROM-Teil mit gleicher Tabelle + First 1 ist nur ein Trick.

globetrotter77 14. Sep 2009 00:51

Re: Firebird Import aus Textdatei extrem langsam
 
Zitat:

Zitat von omata
Zitat:

Zitat von Hansa
Kombination von Clear und Add ist schon gut. :mrgreen:

blödsinn...

Mach es so...
Delphi-Quellcode:
  SQLQueryTemp.SQL.Text:=sqltxt;
  SQLQueryTemp.ExecSQL(true);

macht keinen Unterschied, jedenfalls nicht, was die Laufzeit angeht
Zitat:

Zitat von omata
Zitat:

Zitat von globetrotter77
...ich habe das Problem, dass ich davon ausgehen muss, dass doppelte Schlüssel vorkommen...

Lege die Tabelle ohne Primärschlüssel an...
SQL-Code:
CREATE TABLE tabelle EXTERNAL FILE 'file.txt' (feld1 INT, feld2 CHAR(10));
...und mache danach einen Import in eine andere Tabelle...
SQL-Code:
INSERT INTO richtige_tabelle
SELECT DISTINCT feld1, TRIM(feld2)
FROM tabelle

auch schon darüber nachgedacht, aber ich muss die doppelten Schlüssel zumindest protokollieren, daher ist eine Einzelsatzbearbeitung leider erforderlich ... und mit BDE hat das auch gut funktioniert ... wieso geht das hier nicht mehr?
Zitat:

Zitat von omata
Da hier die Feldinhalte eine konstante Größe (mit Leerzeichen gefüllt) haben müssen, kannst du in diesem Schritt auch gleich die Zeichenketten trimmen.

Zitat:

Zitat von globetrotter77
wie gesagt, ich habe eine Textdatei und keine Tabelle

Das ist mir bewusst, du sollst ja auch das Statement zusammenbauen, der FROM-Teil mit gleicher Tabelle + First 1 ist nur ein Trick.



Alle Zeitangaben in WEZ +1. Es ist jetzt 21:28 Uhr.
Seite 1 von 7  1 23     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