Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Bulk-Import (https://www.delphipraxis.net/203171-bulk-import.html)

hoefi 20. Jan 2020 11:07

Datenbank: Firebird • Version: 2.5.6 • Zugriff über: IBX

Bulk-Import
 
Hallo, ich habe in einer Quelldatenbank (ORACLE) ca. 4-5 Millionen Datensätze einer Tabelle von folgendem Aufbau:
CREATE TABLE QAMV (
ID INTEGER,
PRUEFLOS VARCHAR(12),
VORGLFNR INTEGER,
MERKNR INTEGER,
SATZSTATUS VARCHAR(4),
QPMK_WERKS VARCHAR(16),
VERWMERKM VARCHAR(32),
MKVERSION VARCHAR(24),
KURZTEXT VARCHAR(160),
DUMMY20 VARCHAR(80),
MASSEINHSW VARCHAR(12),
SOLLWERT DOUBLE PRECISION,
TOLERANZOB DOUBLE PRECISION,
TOLERANZUN DOUBLE PRECISION);

Diese sollen in eine Firebirddatenbank eingelesen werden.
Versucht habe ich es bisher zeilenweise mit parametrisierten INSERTS und auch mit Stored-Procedures. Dauert aber immer einige Stunden. Da es nicht die einzige Tabelle ist, die ich nächtlich zu transferieren habe, suche ich nach einer Variante, die deutlich schneller ist. Nun bin ich auch über externe Tabelle bei Firebird gestoßen. Wie werden die Importdateien genau erzeugt? Bis jetzt weiß ich, dass es die Felder ohne Delimiter mit fester Anzahl von Zeichen gespeichert werden müssen. Gibt es eine Funktion, die das Erzeugen von Strings aus z.B. Realzahlen, Datum oder auch Timesstamps ermöglicht? Strings sind kein Problem.
Oder geht das anders schneller?

jobo 20. Jan 2020 11:41

AW: Bulk-Import
 
Du kannst es damit mal versuchen und Deine CSV Files als externe Tabelle definieren:
http://www.firebirdfaq.org/faq209/

https://www.wisdomjobs.com/e-univers...bles-7629.html

(Mir ist nicht ganz klar, ob das eine Server (lokale) Funktion ist oder auch über isql im client geht.)

hoefi 20. Jan 2020 11:46

AW: Bulk-Import
 
ja, das hatte ich auch probiert. Es erzeugt eine Datei, in der man sich anschauen kann, wie die Import-Datei dann aussehen sollte. So jedenfalls mein Verständnis. In dieser Datei werden aber die nummerischen Werte codiert und nicht als Klartext gespeichert. Ich muss aber wohl die Datei selber erzeugen und dann der Datenbank zum Lesen geben.

jobo 20. Jan 2020 11:57

AW: Bulk-Import
 
Vielleicht wird auf dem Weg eine Defaultdatei erzeugt, wenn Du das create statement aufrufst. Aber gemäß 2. Link muss das nicht unbedingt kodiert sein.
P.S.: Falls es so sein sollte, würde ich wahrscheinlich die Zahlen auch als char definieren und im Zielsystem konvertieren.
Bei großen Tabellen und ständiger Wiederholung dieses Verfahrens ist das natürlich resourcen hungrig, aber einmalig ist es sicher vertretbar.
Gennerell ist die Datenübernahme auf reiner Textbasis viel leichter zu handhaben, als vortypisierte Daten zu importieren. Wenn alles importiert ist, kann man schnell und effizient validieren, viel einfacher als bei einem Importfile. Natürlich sollte bei einem sauberen Export aus einem anderen RDBMS auch nicht allzuviel überraschendes passieren.

himitsu 20. Jan 2020 12:25

AW: Bulk-Import
 
Zitat:

zeilenweise mit parametrisierten INSERTS
Ein INSERT pro Zeile oder ein INSERT mit vielen Datenzeilen?

Musst du sowas nur einmal oder öfters/regelmäßig machen?
Wenn ja, dann wäre ein direkter Weg bestimmt angenehmer, als der Umweg über SQL-ImportScripte, CSV, XML oder Dergleichen.

Eventuell gibt es in Firebird auch eine direkte Schnittstelle zu Oracle?

Beispiel in PostgreSQL
https://sql-info.de/postgresql/notes...-firebird.html
* hier wird in Postgres eine CSV eingelesen und als Tabelle an Firebird übertragen

* ein Data-Wrapper (oder wie das dann in Firebird heißen würde) zu Oracle und dann via SELECT+INSERT die Daten direkt von dort ziehen.

* es gibt ForeignDataWrapper für Oracle und Firebird, womit über Postgres zwischen Oracle und Firefird Daten ausgetauscht werden können
* und Postgres muß nicht installiert werden (es gibt eine ZIP zum Entpacken und da kann man den Server auch direkt starten)

TigerLilly 20. Jan 2020 14:41

AW: Bulk-Import
 
Je nachdem, was möglich ist:
- Indices deaktivieren
- Trigger + SP deaktivieren
- RefInts/FK Checks deaktivieren

Dann würde ich noch schauen, wo die Zeit liegen bleibt. Was ist der Flaschenhals? Plattenzugriffe? Prozessor? Speicher?

hoefi 20. Jan 2020 15:11

AW: Bulk-Import
 
Vielen Dank an jobo: der zweite Link hat mir geholfen und nun lese ich 4,5 Mio Datensätze in unter 5 Minuten ein :-)

TigerLilly 20. Jan 2020 17:02

AW: Bulk-Import
 
Nur zur Sicherheit:
- du definierst die Daten als externe Tabelle
- und liest sie von dort in die Firebird-Tabelle ein?

jobo 20. Jan 2020 17:49

AW: Bulk-Import
 
Zitat:

Zitat von hoefi (Beitrag 1455609)
nun lese ich 4,5 Mio Datensätze in unter 5 Minuten ein

Das klingt brauchbar, so soll es sein!

Cool wäre, wenn Du für andere schreibst, was das Problem gelöst hat.

TurboMagic 20. Jan 2020 20:27

AW: Bulk-Import
 
FireDAC beherrscht bei Firebird ArrayDML, damit kann ein Insert viele Datensätze verarbeiten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:49 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf