nicro87
Goto Top

Massenimport bzw INSERT mit MSSQL 2008

Hallo zusammen,

ich versuche nun seit längerem Massendaten aus DBF-Dateien auszulesen und in eine MS SQL-Datenbank zu importieren.
Da ich keine SSID-Packete erstellen kann verwende ich dazu C# mit einem BulkInsert. Soweit so gut.

Ich importiere die Daten jedoch nur in eine temporäre Zwischentabelle, welche nach dem import der DBF-Dateien ca. 30 Millionen Datensätze umfasst.
Nun gestaltet sich in Insert in die andere Tabelle mit Indizes und Autowert relativ schwierig, da dieses Kommando so um die 50GB RAM auf unserem Cluster frisst face-smile

Deshalb würde ich gerne wissen ob ihr eine Möglichkeit seht diese 30 Millionen Datensätze eleganter und mit weniger Auslastung von der Temp-Tabelle in die Produktiv-Tabelle zu importieren?!

Indizes werden vor dem Insert natürlich ausgeschaltet.

Vielen Dank für Eure Hilfe.

Nicro87

Content-Key: 180257

Url: https://administrator.de/contentid/180257

Ausgedruckt am: 28.03.2024 um 23:03 Uhr

Mitglied: nicro87
nicro87 14.02.2012 um 08:59:34 Uhr
Goto Top
Hallo,

weiß niemand eine Lösung?

Gruß
Nico
Mitglied: MadMax
MadMax 15.02.2012 um 17:10:10 Uhr
Goto Top
Hallo Nico,

warum muß da überhaupt eine Zwischentabelle her? Importiere doch direkt in die richtige Tabelle.

Ansonsten ist die Frage, wie es eleganter und besser geht, schwer zu beantworten, wenn man nicht genau weiß, was Du machst. Du machst einen Import und der klappt nicht so, wie Du willst, ist ein bisschen vage face-smile

Gruß, Mad Max
Mitglied: nicro87
nicro87 05.03.2012 um 13:23:40 Uhr
Goto Top
Hallo Mad Max,

die Zwischentabelle halten wir zum einen für Sinnvoll, da in weiteren Bearbeitungsschritten noch Spalten hinzugefügt werden und zum anderen ist so weniger Last auf dem Server, oder nicht?
Ist es überhaupt Sinnvoll zuerst die Indizes auszuschalten und danach wieder einzuschalten? Die CPU-Auslastung geht nämlich stark nach oben, wenn man dies bei knapp 100.000.000 DS tut.

Ich bin auch gerade wieder dabei und lasse Schritt für Schritt über Transaktionen nur wenige Datensätze importieren, dies steigert die Last jedoch auch stark.

Ich denke es sind einfach zu viele Datensätze.

Gruß
Nico
Mitglied: MadMax
MadMax 06.03.2012 um 00:32:40 Uhr
Goto Top
Nabend Nico,

da bin ich nicht ganz Deiner Ansicht. Wenn ich erst ein paar Millionen (oben waren es noch 30, jetzt sind es sogar knapp 100) DS per Massenimport in eine Tabelle schiebe und sie dann nochmal woanders hinschiebe, dann habe ich die doppelte Anzahl DS bewegt. Mir fällt kein Grund ein, warum das in irgendeiner Weise effizienter sein soll, als ein einziger Massenimport ohne zusätzliche Datenbewegungen.

Indexe ausschalten kann insofern sinnvoll sein, daß es schneller sein soll, einen Index am Ende komplett am Stück aufzubauen, als ihn während des Insert mitpflegen zu lassen. Wie sich das bei Massenimporten und 30 oder 100 Mio DS auswirkt, kann ich Dir allerdings nicht sagen.

Aber Du solltest mal das Wiederherstellungsmodell Deiner DB anschauen. Wenn das auf "vollständig" steht, solltest Du es vielleicht auf "massenprotokolliert" stellen, damit das Transaktionsprotokoll nicht so voll läuft. Der Kopiervorgang von der temporären zur produktiven Tabelle füllt das TP aber auf jeden Fall.

Am günstigsten kommst Du definitiv weg, wenn Du das massenprotokollierte Wiederherstellungsmodell einstellst und die Daten direkt in die richtige Tabelle importierst. Das mit den Indexen müßte man testen. Auch sollte man schauen, ob irgendwelche Trigger auf der Tabelle liegen und sie ggf. ausschalten. Aufgaben, die im Trigger erledigt werden, können womöglich anschließend am Stück schneller erledigt werden.

Gruß, Mad Max
Mitglied: nicro87
nicro87 13.03.2012 um 19:42:14 Uhr
Goto Top
Hallo Mad Max,

das hilft mir schonmal weiter, da ich mich mit dem SQL-Server an sich wirklich wenig auskenne.

Richtig ist, dass ich jeden Monat 25-30 Mio importiere und da wir nun mehrere Monate importiert haben (6 dürfen wir maximal zurückhalten) in der produktiven Tabelle nun an die 100 Mio sind.

Daher war die Überlegung die 30 Mio von der temp. in die produktive zu importieren.

Mittlerweile habe ich auch ein Script welches pro Kundennummer die Datensätze rüberkopiert.
Jedoch bringt das anschalten des Index die CPU-Last dann sehr hoch.

Den Ram-Verbrauch kann man pro Server-Instanz jedoch einstellen (habe ich auch erst vor kurzem gesehen). So kriegt unser Servermanagement nicht direkt nen Alarm und wir sind so auch einigermaßen zufrieden.

Es sind halt wirklich viele Daten und das kann wohl auch so nen kleinen Cluster ins Schwitzen bringen ;) (hehe gut, dass der ne Klimaanlage hat^^)

Mit dem Transaktionsprotokoll ist nen guter Tipp, das werde ich direkt mal probieren...

Vielen Dank ich denke das Thema ist damit gelöst.

Gruß
Nico
Mitglied: MadMax
MadMax 15.03.2012 um 12:34:21 Uhr
Goto Top
Moin Nico,

schön, wenn es Dir geholfen hat.

Wenn Dein Problem gelöst ist, kannst Du ja auch das grüne Häkchen setzen face-smile

Gruß, Mad Max