AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Bulk-Import

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

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#1

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
44.360 Beiträge
 
Delphi 12 Athens
 
#2

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)
Ein Therapeut entspricht 1024 Gigapeut.

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

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.241 Beiträge
 
Delphi 12 Athens
 
#3

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
10 Beiträge
 
#4

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
Benutzerbild von TigerLilly
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.241 Beiträge
 
Delphi 12 Athens
 
#5

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
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#6

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
3.039 Beiträge
 
Delphi 12 Athens
 
#7

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
hoefi

Registriert seit: 20. Aug 2007
10 Beiträge
 
#8

AW: Bulk-Import

  Alt 21. Jan 2020, 07:08
Hallo jobo,

hier mein Ansatz.
1. Erzeugen der CSV-Datei (hier aus einer HANA-DB) in Delphi:
Delphi-Quellcode:
    laenge[0] := 8; // Laengenvorgabe der Ausgabefelder
    laenge[1] := 12;
    laenge[2] := 8;
    laenge[3] := 8;
    laenge[4] := 4;
    laenge[5] := 16;
    laenge[6] := 32;
    laenge[7] := 24;
    laenge[8] := 160;
    laenge[9] := 80;
    laenge[10] := 12;
    laenge[11] := 8;
    laenge[12] := 8;
    laenge[13] := 8;
    datei := 'C:\temp\qamv1.csv'; // Ausgabedatei
    AssignFile(dd,datei);
    REWRITE(dd);
    WITH H2R_Query DO
      BEGIN
       CLOSE;
       SQL.CLEAR;
       SQL.Add('SELECT C.PRUEFLOS, C.VORGLFNR, C.MERKNR, C.SATZSTATUS, C.QPMK_WERKS, C.VERWMERKM, C.MKVERSION, C.KURZTEXT, C.DUMMY20, C.MASSEINHSW, C.SOLLWERT, C.TOLERANZOB, C.TOLERANZUN');
       SQL.Add('FROM QALS Q, QAMV" C');
       SQL.ADD('WHERE Q.WERK = ''XXXX'' AND');
       SQL.ADD(' C.PRUEFLOS = Q.PRUEFLOS AND');
       SQL.ADD(' Q.ERSTELDAT >= TO_DATE(''01.01.2010'',''dd.mm.yyyy'')');
       OPEN; // holen der Daten
       i := 0;
       WHILE NOT EOF DO
         BEGIN
           s := IntToStr(i);
           WHILE LENGTH(s) < 8 DO s := '0' + s; // ID als Integer darstellen
           st := '';
           FOR j := 0 TO Fields.Count - 1 DO // Felder anpassen
             BEGIN
               st := Fields[j].AsString;
               WHILE LENGTH(st) < lae[j+1] DO st := st + ' ';
               IF Fields[i].DataType IN [ftFloat, ftCurrency, ftSingle]
                 THEN WHILE POS(',',st) > 0 DO st[POS(',',st)] := '.'; // numerische Felder einen Punkt als Dezimaltrenner geben
               s := s + st;
             END;
             WRITELN(dd,s);
           INC(i);
           IF i = max_anz THEN BREAK;
           NEXT;
         END;
      END;
    CloseFile(dd);
2: Definition der externen Tabelle in FB:

SQL-Code:
CREATE TABLE QAMV_TEXT EXTERNAL 'C:\TEMP\QAMV1.CSV' (
    ID CHAR(8),
    PRUEFLOS CHAR(12),
    VORGLFNR CHAR(8),
    MERKNR CHAR(8),
    SATZSTATUS CHAR(4),
    QPMK_WERKS CHAR(16),
    VERWMERKM CHAR(32),
    MKVERSION CHAR(24),
    KURZTEXT CHAR(160),
    DUMMY20 CHAR(80),
    MASSEINHSW CHAR(12),
    SOLLWERT CHAR(8),
    TOLERANZOB CHAR(8),
    TOLERANZUN CHAR(8),
    LFCR CHAR(2)
);

3: Definition der Zieltabelle in FB:
CREATE TABLE QAMV (
    ID INTEGER,
    PRUEFLOS CHAR(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,
    LFCR CHAR(2)
);
4: Stored Procedure für das Übertragen der externen Tabelle in die Zieltabelle:
SQL-Code:
create or alter procedure QAMV_WANDELN
as
begin
  insert into qamv
    select * from QAMV_TEXT;
end
Was ich nicht berechnet habe, ist das anschließende Erzeugen des Indexes.
Werde heute mal probieren, weitere Tabellen ebenso zu übertragen.

Geändert von mkinzler (21. Jan 2020 um 07:12 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 15:15 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-2025 by Thomas Breitkreuz