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
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
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 180257
Url: https://administrator.de/forum/massenimport-bzw-insert-mit-mssql-2008-180257.html
Ausgedruckt am: 29.04.2025 um 21:04 Uhr
6 Kommentare
Neuester Kommentar
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
Gruß, Mad Max
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
Gruß, Mad Max
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
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