Allgemeine Frage - größerer Datentransfer zu Datenbankserver

Christoph1972

Benutzer
Beiträge
18
Hallo zusammen,

ich muss eine größere Datenmenge (ca.5GB) aus einer Access Datei in eine Oracle Datenbank schaffen. Da das Schema der Datenbank anders ist als das der Access Datei, werde ich die Daten mit einem selbst gemachten Programm kopieren. Nun meine Frage: Kann ich alle Datensätze einfach nach und nach an den Server senden, oder sollte ich eine Verzögerung mit einbauen? Ich habe etwas Angst, das System zu überlasten, oder ist das kein Problem? Ab wann (ungefähr) wird so ein Transfer kritisch?

Über eure Anregungen würde ich mich sehr freuen!

Herzliche Grüße
Christoph
 
Werbung:
Eigentlich müsste die Datenbank das in jedem Fall aushalten, der Transfer wird unter Umständen langsamer.
Wo die Grenzen der DB liegen kann dir hoffentlich der Betreiber des Oracle Servers sagen. Der kennt das Sizing.
 
5GB sind bei einem normalem Server eine Sache von wenigen Minuten.
Ich fürchte nur, dass dein ETL Programm uns da einen Strich durch die Rechnung machen könnte ;-)

Empfehlung wäre, die Daten bereits im Zielformat als Text zu entladen und dann per sqlloader zu laden oder in der Oracle DB die Tabellen 1:1 abzubilden und dann die Transformation dort vorzunehmen und per SQL in die Zielstruktur zu laden.

Welche Oracle Version verwendest du? Wie arbeitet denn Dein Programm?
 
Guten Morgen! :)

Vielen Dank schon mal!

5GB sind bei einem normalem Server eine Sache von wenigen Minuten.

Das hört sich doch schon mal nicht schlecht an!


Ich fürchte nur, dass dein ETL Programm uns da einen Strich durch die Rechnung machen könnte ;-)

Inwiefern sollte das Programm da ein Strich durch die Rechnung machen?


mpfehlung wäre, die Daten bereits im Zielformat als Text zu entladen und dann per sqlloader zu laden oder in der Oracle DB die Tabellen 1:1 abzubilden und dann die Transformation dort vorzunehmen und per SQL in die Zielstruktur zu laden.

Serverseitig möchte ich das nicht erledigen, dafür kenne ich zu wenig SQL, ausserdem möchte ich die Komponenten aus dem Transformationsprogramm später weiterverwenden.


Welche Oracle Version verwendest du? Wie arbeitet denn Dein Programm?

11g

Das Pogramm holt sich Datensatz für Datensatz mit Relations aus der Access Datei, dazu kommen noch Dokumente die komprimiert und als Blop gespeichert werden. Mit dem Programm sind bereits die ersten Komponenten für das eigentliche Programm entstanden, was ich aktuell entwickele.,

Einen schönen Arbeitstag wünsche ich!
Christoph
 
Inwiefern sollte das Programm da ein Strich durch die Rechnung machen?
Wegen dem Satz:
Das Pogramm holt sich Datensatz für Datensatz mit Relations aus der Access Datei,

Das könnte dann etwas länger dauern als nur ein paar Minuten. Einzelsatzverarbeitung hat einfach mehr Overhead, alleine der Weg übers Netzwerk kann, je nach Anzahl der Zeilen, die Laufzeit signifikant erhöhen.

Um das zu reduzieren sollte folgendes für die Migration gemacht werden:
- Autocommit abschalten
- Bindvariablen und Batchverarbeitung verwenden. In JDBC wäre das die addBatch Methode aus dem PreparedStatement
- Commit nicht nach jedem Satz, sondern z.B. alle 1000 Sätze, pro Tabelle oder auch erst ganz am Ende sofern die Migration entsprechend stabil ist
- Wenn Du einen OR Mapper verwendest, muss man evtl. ein wenig was umbauen um ihn zum BatchInsert zu überreden.

Ich würd mal 10 oder 20 Tsd Sätze in das Testsystem migrieren, dann kann man schon mal eine erste Aussage machen, wie lange das dauert.
 
Vielen Dank für die Infos!

So wie es aussieht, ist die Access Datei der Flaschenhals. In der Haupttabelle befinden sich 56000 Datensätze, das abfragen dauert sehr lange. Die Abfrage mache ich mit c# & OleDbConnection. Ein "SELECT ID FROM Hauttabelle" dauert bereits 12 Sekunden. Da muss ich morgen mal forschen was da los ist.
 
In der Haupttabelle befinden sich 56000 Datensätze, das abfragen dauert sehr lange. Die Abfrage mache ich mit c# & OleDbConnection. Ein "SELECT ID FROM Hauttabelle" dauert bereits 12 Sekunden.

Mal nachstellen:

Code:
test=*# create table bla(id int primary key, val text);
CREATE TABLE
test=*# insert into bla select s, md5(random()::text) from generate_series(1, 100000) s;
INSERT 0 100000
test=*# explain analyse select id from bla;
  QUERY PLAN   
-----------------------------------------------------------------------------------------------------------
 Seq Scan on bla  (cost=0.00..1893.18 rows=105918 width=4) (actual time=0.021..23.220 rows=100000 loops=1)
 Planning time: 0.147 ms
 Execution time: 33.157 ms
(3 Zeilen)

Mal so als Richtwert bei 100000 Datensätzen: 33Millisekunden
 
@Christoph1972
Liegt die Access DB auf einem Netzlaufwerk oder ist die lokal auf dem Rechner?
Sind die Binärdateien Teil der Datenbank oder werden die in deiner Anwendung dazugemischt?

Die Datei liegt auf einem Netzlaufwerk.

Binärdaten sind Teil der bestehenden Daten, meine Programm wird später noch weitere dazu mischen.

Ich werde heute versuchen, mit dem "Data Import Tool" des SQL Servers die Daten auf einen SQL Server zu kopieren, vielleicht geht das schneller. Damit wäre dann auch eine Migration von Server zu Server möglich.
 
Kopier die Access DB für die Migration auf deinen lokalen Rechner.
Aus meiner altes Accesszeit weiß ich, dass hier die Laufzeiten extrem in den Keller gehen.
 
Werbung:
Kopier die Access DB für die Migration auf deinen lokalen Rechner.
Aus meiner altes Accesszeit weiß ich, dass hier die Laufzeiten extrem in den Keller gehen.

Danke, das hat sehr geholfen! Aber dennoch bleibt die Access Datei der Flaschenhals bei der Geschichte, die Frage hier, in der ursprünglichen Form, hätte ich mir sparen können. :)

Vielen Dank an euch für die nette Unterstützung!

Herzliche Grüsse
Christoph
 
Zurück
Oben