7 Stimmen

Hochladen einer umfangreichen CSV-Datei in die SQL Server-Datenbank

Ich muss eine riesige CSV-Datei (16 GB, 65+ Millionen Datensätze) in eine einzelne Tabelle in einer SQL Server 2005-Datenbank hochladen. Hat jemand einen Tipp, wie man das am besten macht?

Einzelheiten

Ich verwende derzeit eine C#-Konsolenanwendung (.NET Framework 2.0), um die Importdatei in Dateien mit 50000 Datensätzen aufzuteilen und dann jede Datei zu verarbeiten. Ich lade die Datensätze von der Konsolenanwendung aus mit der Klasse SqlBulkCopy in Stapeln von 5000 in die Datenbank hoch. Das Aufteilen der Dateien dauert etwa 30 Minuten, und das Hochladen des gesamten Datensatzes (über 65 Millionen Datensätze) dauert etwa 4,5 Stunden. Die Größe der generierten Datei und die Größe des Stapel-Uploads sind beides Konfigurationseinstellungen, und ich versuche, den Wert beider zu erhöhen, um die Leistung zu verbessern. Zur Ausführung der Anwendung verwenden wir einen Quad-Core-Server mit 16 GB RAM. Dieser Server ist auch der Datenbankserver.

Update

In Anbetracht der bisherigen Antworten ist zu beachten, dass vor der Einfuhr:

  • Die Datenbanktabelle wird abgeschnitten, und alle Indizes und Beschränkungen werden gelöscht.
  • Die Datenbank wird verkleinert, und es wird Speicherplatz zurückgewonnen.

Nachdem der Import abgeschlossen ist:

  • Die Indizes werden neu erstellt

Wenn Sie andere Ansätze vorschlagen können oder Möglichkeiten, wie wir die bestehende Importanwendung verbessern können, wäre ich Ihnen dankbar. Danke!

Verwandte Frage

Die folgende Frage könnte für andere, die sich mit diesem Problem befassen, von Nutzen sein:

Lösung

Ich habe die Auswirkungen der Änderung der Stapelgröße und der Größe der Splitdateien untersucht und festgestellt, dass Stapel von 500 Datensätzen und Splitdateien von 200.000 Datensätzen für meine Anwendung am besten funktionieren. Die Verwendung der SqlBulkCopyOptions.TableLock auch geholfen. Siehe die Antwort auf diese Frage question für weitere Einzelheiten.

Ich habe auch die Verwendung eines SSIS-DTS-Pakets und eines BULK INSERT SQL-Skript. Das SSIS-Paket schien schneller zu sein, bot mir aber nicht die Möglichkeit, ungültige Datensätze usw. zu erfassen. Das BULK INSERT Das SQL-Skript war zwar langsamer als das SSIS-Paket, aber wesentlich schneller als die C#-Anwendung. Es ermöglichte mir, Fehler usw. aufzuzeichnen, und aus diesem Grund akzeptiere ich die BULK INSERT Antwort von ConcernedOfTunbridgeWells als die Lösung. Ich bin mir bewusst, dass dies vielleicht nicht die beste Antwort für alle ist, die mit diesem Problem konfrontiert sind, aber es löst mein unmittelbares Problem.

Vielen Dank an alle, die geantwortet haben.

Mit freundlichen Grüßen, MagicAndi

0voto

kemiller2002 Punkte 110605

Haben Sie versucht, die Bulk-Insert-Verfahren in Sql Server?

0voto

Benedikt Punkte 894

In letzter Zeit musste ich auch viel hochladen/importieren (ich habe ein PHP-Skript erstellt).

Ich beschloss, sie Aufzeichnung für Aufzeichnung zu bearbeiten.

Natürlich dauert es länger, aber für mich waren die folgenden Punkte wichtig: - einfach den Prozess anhalten - bessere Fehlersuche

Dies ist nur ein Tipp.

Grüße, Benedikt

0voto

Daniel Brückner Punkte 57561

BULK INSERT ist wahrscheinlich bereits der schnellste Weg. Sie können zusätzliche Leistung erzielen, indem Sie Indizes und Beschränkungen während des Einfügens aufheben und sie später wiederherstellen. Den größten Einfluss auf die Leistung haben geclusterte Indizes.

0voto

Rad Punkte 8279

Haben Sie es mit SQL Server Integration Services versucht? Er könnte besser in der Lage sein, eine so große Textdatei zu verarbeiten.

0voto

cjk Punkte 44394

Nur zur Kontrolle, Ihr Einfügen wird schneller sein, wenn es keine Indizes auf der Tabelle gibt, in die Sie einfügen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X