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