AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Bulk-Import

Ein Thema von hoefi · begonnen am 20. Jan 2020 · letzter Beitrag vom 21. Jan 2020
Antwort Antwort
Seite 1 von 2  1 2   
hoefi

Registriert seit: 20. Aug 2007
7 Beiträge
 
#1

Bulk-Import

  Alt 20. Jan 2020, 11:07
Datenbank: Firebird • Version: 2.5.6 • Zugriff über: IBX
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?
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
2.784 Beiträge
 
Delphi 2010 Enterprise
 
#2

AW: Bulk-Import

  Alt 20. Jan 2020, 11:41
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.)
Gruß, Jo

Geändert von jobo (20. Jan 2020 um 11:45 Uhr)
  Mit Zitat antworten Zitat
hoefi

Registriert seit: 20. Aug 2007
7 Beiträge
 
#3

AW: Bulk-Import

  Alt 20. Jan 2020, 11:46
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.
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
2.784 Beiträge
 
Delphi 2010 Enterprise
 
#4

AW: Bulk-Import

  Alt 20. Jan 2020, 11:57
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.
Gruß, Jo

Geändert von jobo (20. Jan 2020 um 12:04 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
35.445 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Bulk-Import

  Alt 20. Jan 2020, 12:25
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (20. Jan 2020 um 16:35 Uhr)
  Mit Zitat antworten Zitat
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
693 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Bulk-Import

  Alt 20. Jan 2020, 14:41
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?
  Mit Zitat antworten Zitat
hoefi

Registriert seit: 20. Aug 2007
7 Beiträge
 
#7

AW: Bulk-Import

  Alt 20. Jan 2020, 15:11
Vielen Dank an jobo: der zweite Link hat mir geholfen und nun lese ich 4,5 Mio Datensätze in unter 5 Minuten ein
  Mit Zitat antworten Zitat
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
693 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Bulk-Import

  Alt 20. Jan 2020, 17:02
Nur zur Sicherheit:
- du definierst die Daten als externe Tabelle
- und liest sie von dort in die Firebird-Tabelle ein?
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
2.784 Beiträge
 
Delphi 2010 Enterprise
 
#9

AW: Bulk-Import

  Alt 20. Jan 2020, 17:49
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.
Gruß, Jo
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
634 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: Bulk-Import

  Alt 20. Jan 2020, 20:27
FireDAC beherrscht bei Firebird ArrayDML, damit kann ein Insert viele Datensätze verarbeiten.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:11 Uhr.
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