![]() |
Re: Firebird Import aus Textdatei extrem langsam
Was soll dann geschehen ( bei doppelten PKs)?
|
Re: Firebird Import aus Textdatei extrem langsam
Hallo,
die doppelten sollen doch ignoriert werden (?). 3 Fragen an den Thread-Ersteller: - Server und Client auf der gleichen Maschine oder 2 Rechner ? - Version der fbclient.dll stimmt mit Server über ein ? Welche Version genau ? - Welche Datenstruktur hat die Tabelle ? Sonderpreis-Frage: Mal den Virenscanner deaktiviert ? Heiko |
Re: Firebird Import aus Textdatei extrem langsam
Überschreiben wäre natürlich einfacher (
SQL-Code:
)
update or insert into ....
|
Re: Firebird Import aus Textdatei extrem langsam
Die Erfahrung der langsamen Transaktion habe ich auch.
Im Grunde nutze ich einen öhnlichen Code um aus der BDE die Daten in Firebird zu migriren. Allerdings verwende ich die IBDAC. Da ich die BDE Tabellen zerlegen muss, sind mehrere Aufrufe über TQuery notwendig um die jeweiligen Firebird Tabellen zu füllen. Am Ende des "Umbaus" steht ein INSERT INTO der mit Parametern gefüllt wird. Und die Performance ist ähnlich schlecht wie beschrieben. Das Ganze läuft bei mit komplett lokal. Es liegt somit die Vermutung nah, dass das Absetzen einzelner Datensätze die Performance des lokalen Firebirdserver ziemlich ausbremst. Wenn ich den Thread hier richtig verstehe, kann über die Transaktionskontrolle das Absetzen mehrerer Statements gebündelt werden. Ist es richtig, dass SQL.Text mehr als ein INSERT Statement enthalten darf? |
Re: Firebird Import aus Textdatei extrem langsam
Nein, ein normaler Query nimmt immer nur ein Statement auf. Es gibt aber in jeder Komponentensammlung auch eine skript-Komponente. Explizite Transaktionssteuerung bedeutet, dass kein Autocommit, nach jedem Insert ausgeführt wird, sondern dass dieser manuell erfolgt. Bei einzelnen Inserts ( unprepared; ohne Parameter) muss zusätzlich für jeden Insert ein Plan gebildet werden. Die Kombination von parametrisierten Abfragen mit Transaktionssteuerung sollte deshlab einiges bringen. Zudem könnte man überlegen die Dupletten vorher aus zu sortieren.
|
Re: Firebird Import aus Textdatei extrem langsam
Danke, ist aber genau das was ich befürchtet hatte.
Doppelte Datensätze gibt es nicht, ich muss nur häufiger durch die Tabellen um diese in neue Häppchen zu zerlegen. Wenn man schon migriert, dann kann man ja auch gleich das Design überarbeiten. |
Re: Firebird Import aus Textdatei extrem langsam
Ich würde, wie gesagt prepared Queries verwenden. Man könnte sich auch überlegen für diesen Fall ein SP zu nehmen
Zitat:
|
Re: Firebird Import aus Textdatei extrem langsam
Hallo,
Zitat:
Bei einem ähnlichen Problem mit 'nem SQL-Server bin ich hergegangen und habe 100 Inserts in einer Stringliste gesammelt und dann zusammen einer TAdoQuery zugewiesen und gemeinsam per ExecSQL ausgeführt. Das funktioniert, jedes Statement muss dann aber mit einem Semikolon enden. Es ist zumindest mal einen Versuch wert, ob Firebird damit auch zurecht kommt. So könnte man dann eben 100 (oder so) Statements in eine Transaktion packen. Bei meinem Rechner und der benutzen Datenbank habe ich mit 100er-Schritten das beste Ergebnis erhalten, bei weniger Inserts, wurde es deutlich langsamer, bei mehr musste ich mit Timeouts rechnen. |
Re: Firebird Import aus Textdatei extrem langsam
Hallo,
Zitat:
Ist denn der Häppchen-Code wirklich so kompliziert, dass er nicht in eine SP passt ? Heiko |
Re: Firebird Import aus Textdatei extrem langsam
Zitat:
Schön wär's wenn es in eine SP passen würde. Leider sind Ergänzungen und/oder Zerlegungen drin. Für eine Einmalige Umstellung viel zu aufwendig. Gruß Karsten |
Re: Firebird Import aus Textdatei extrem langsam
Zitat:
|
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 |
Re: Firebird Import aus Textdatei extrem langsam
Liste der Anhänge anzeigen (Anzahl: 1)
So ich habe mich jetzt nochmal dran versucht.
Zitat:
Zitat:
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:
|
Re: Firebird Import aus Textdatei extrem langsam
Hallo,
Also
Delphi-Quellcode:
du rufst nach jedem Insert Application.ProcessMessages; auf.
SQLDataSet.ExecSQL;
Application.ProcessMessages; Ich würde das ändern in
Delphi-Quellcode:
Da du ja hier eh einen Zähler (Fzeile) hast,
if (FZeile mod 100) then
begin Application.ProcessMessages; end; könnte man auch den Tip mit Commit/StartTransaction einbauen
Delphi-Quellcode:
Zusammen also wie folgt:
if (FZeile mod 100) then
begin SQLConnection.Commit(TD); SQLConnection.StartTransaction(TD); end;
Delphi-Quellcode:
Ich würde es so wie hier getrennt lassen,
if (FZeile mod 100) then
begin Application.ProcessMessages; end; if (FZeile mod 100) then begin SQLConnection.Commit(TD); SQLConnection.StartTransaction(TD); end; dann kann man am mod X noch rumspielen. Zitat:
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 |
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 |
Re: Firebird Import aus Textdatei extrem langsam
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
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. |
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. |
Re: Firebird Import aus Textdatei extrem langsam
Zitat:
|
Re: Firebird Import aus Textdatei extrem langsam
Zitat:
|
Re: Firebird Import aus Textdatei extrem langsam
Zitat:
Zusatz: Zugriff über DBExpress (so wie der TE auf die DB zugreift) Darauf wird natürlich mit keiner einzigen Silbe mal eingegangen, echt bedauerlich. |
Re: Firebird Import aus Textdatei extrem langsam
Hallo,
Zitat:
BTW: Hast du das mit dem SQL-Monitor denn nun mal ausprobiert ? Kleine Info: Ich arbeite seit IB4 (Linux-Version) mit Interbase ... Und ich benutze bei Performance-Problemen zuallerst den SQL-Monitor. Deshalb mein Hinweis dazu. Heiko |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:29 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