CSV Datei in MSSQL DB oder doch SQL Script

HakBak

Aktives Mitglied
Hallo,
ich stehe vor einem Problem und zwar erstelle ich in meinem Javaprogramm im Augenblick eine txt.Datei mit Daten, die per ; voneinander getrennt sind.
Diese Datei wird direkt auf einem Rechner erstellt, auf dem ein MS-SQL Server läuft. Nun möchte ich diese Daten in die Datenbank bringen.
Meine erste Idee war, das ganze per bulk insert in eine temp-Tabelle zu schreiben und dann die eigentlich aktuelle Tabelle mit der temp-Tabelle zu updaten. Nun ist es aber so, dass die temp-Tabelle weniger Spalten haben wird, als die eigentlich Tabelle. Jetzt weiss ich nciht, ob das so einfach möglich ist.

Meine nächste Idee war es, keine Daten-datei zu erstellen, sondern ein sql-script, welches updates und inserts der daten beinhaltet. Jetzt weiss ich allerdings nicht, ob, und wenn ja, wie ich per Java eine sql-script ausführe. Und es soll nciht mit einem FileReader eingelesen werden und Zeile für Zeile durchgegangen werden, es soll direkt über einen Befehl oder sonst was vom SQL-Server ausgeführt werden, eben ähnlich einem Bulk-insert.

Meine dritte Idee war es, die Daten-datei (wieder mit dem ; als Seperator), in eine extra dafür angelegte Tabelle zu schreiben, wieder mittels bulk-insert und diese dann mit stored procedures in die eigentlich produktiv Tabell zu updaten. Ich habe bis jetzt leider keinerlei Ahnung von stored procedure. Vielleicht könnt ihr mir ein wenig dabei helfen.

So, das sind meine drei Vorschläge, könnt ihr mir da irgendwie bei meiner Wahl helfen?
Danke
 
Weil das zu lange dauert, ich hab ca. 400.000 Datensätze und diese in die DB zu schreiben würde SEHR lange dauern - habs schon ausprobiert. Deswegen auch die Idee ein File direkt auf den Server zu schreiben und den Import von dort aus durchzuführen, da es übers Netz zu lange dauert.
 
Weil das zu lange dauert, ich hab ca. 400.000 Datensätze und diese in die DB zu schreiben würde SEHR lange dauern - habs schon ausprobiert. Deswegen auch die Idee ein File direkt auf den Server zu schreiben und den Import von dort aus durchzuführen, da es übers Netz zu lange dauert.
Hast du mit batchUpdates & Transaktionen gearbeitet?
Die größe der beiden macht den Unterschied 😉

Wenn du weder das eine noch das andere eingesetzt hast, wirdf es Zeit, denn der Umweg über die Datei ist nicht wirklich der direkte Weg 😉
 
Also eigentlich solltest du aus performance Gründen eher den Weg über die DB wählen, als über ein extra File...
Denn ob du das ganze in eine Datei schreibst, oder in die DB (so lange Sie das noch nicht direkt persistiert), spielt keine Rolle....
Und das ganze fix persistieren sollte dann schneller gehen, als ein weiterer Import aus dem File.
 
Also direkt vom Programm aus, über eine Connection immer ein ein Updatestatement absetzen, dauert einfach zu lange.
Über eine Transaktion, die bei mir wie folgt aussehen würde:

Java:
Connection connMSSQLTest   = connectToMSSQLStamm();
            connMSSQLTest.setAutoCommit(false);
            Statement stmt;
            try
            {
                stmt = connMSSQLTest.createStatement();
                for(String elem : entityMap.keySet())
                {
                    count++;
                    KEntity entity = entityMap.get(elem); //die entityMap beinhaltet ca. 400000 Objekte, in denen die Daten, die in die Datenbank sollten, gespeichert sind
                    stmt.executeUpdate(entity.getUpdateStatement()); //gibt das Updatestatement mit den Daten zurück
                }
                connMSSQLTest.commit();
            }

Über Batch bekomm ich Probleme mit dem Speicher und es gibt nen heap space error. Vielleicht wenn, dich die Batch Updates aufsplitte ...?
 
Wenn du 400000 Datensätze einfügen willst kommst du eigentlich nie mit der Standard Heapgröße aus, die JVM Paramter heissen Xms und Xmx.
 
Du solltest das Statement nur einmal kompilieren und für die jeweiligen Datensätze vor dem Update nur die Bindings entsprechend setzen. Bei zig tausend calls machen sich die paar Millisekunden schnell bemerkbar.
 
Du solltest das Statement nur einmal kompilieren und für die jeweiligen Datensätze vor dem Update nur die Bindings entsprechend setzen. Bei zig tausend calls machen sich die paar Millisekunden schnell bemerkbar.

Sorry, wenn ich nochmal nachfragen, muss, wie meinst du das? Bezieht sich das jetzt auf die Transaktion, oder auf die Batch-Update? Ich dachte, ich erstelle in meinem Code zuerst das komplette Statement...
 

Neue Themen


Zurück
Oben