Ich hatte zum Teil Probleme beim Import von Massendaten mit den Zeiten. So war meine bisherige Vorgehensweise, dass ich die Daten erst in eine Temp -Tabelle geschrieben habe. Danach die Daten mehrmals validiert habe und im letzten Schritt verwertbare Datensätze in eine richtige Tabelle geschrieben habe. Datensätze mit Fehlern wurden in eine andere Tabelle geschrieben und als Fehler ausgegeben.
Dieses Vorgehen war mit LINQ und mehrfachem Speichern sehr langsam!
Ich habe nun mit meinem Kollegen Ralf Stiegele zusammen verschiedene Datenszugriffe ausprobiert und die Zeiten gemessen. Da beim Test kein Unterschied zwischen SQL 2005 und 2008 zu sehen war, schreibe ich nur vom SQL Server. Die Testdatei im Import hat 160.000 Zeilen und 60 Spalten. Es wurden 3 Läufe als Mittel gewertet und auf ganze Minuten gerundet. Bei diesen Import wurden keine Validierungen berücksichtigt.
|
|
Programm läuft auf dem SQL Server direkt ab (4GB Ram / 2 Prozessoren) |
Programm läuft auf einem separaten virtuellen Client ab (4GB Ram / 2 Prozessoren / GB-LAN) |
Programm läuft auf einem separaten physischen Client ab (2 GB Ram / 1 Prozessor / 100MBit LAN) |
|
Import Stored Procedures |
17 Minuten |
17 Minuten |
31 Minuten |
|
Import mit LINQ
|
6 Minuten |
7 Minuten |
15 Minuten |
|
Import mit Datasets
|
6 Minuten |
7 Minuten |
14 Minuten |
|
Import mit Direct SQL
|
6 Minuten |
7 Minuten |
11 Minuten |
|
Import mit Integration Sercvices (SSIS) |
nicht gemessen |
nicht gemessen |
6 Minuten |
|
SQLBulkCopy |
1 Minute |
1 Minute |
nicht gemessen |
Gefühlt müsste es schneller gehen… Hat jemand noch eine bessere Alternative oder bessere Zeiten gemessen?
Bei uns ist der SSIS schwierig zu deployen und LINQ bietet am meisten Komfort. Wenn ich nun Programmierzeiten und Zeitersparnis bewerte, würde ich weiter LINQ nehmen und nur auf das Zwischenspeichern verzichten. Alle Validierungen müssten also beim ersten Einlesen passieren. Das Speichern von Daten im SQL Server ist einfach sehr Ressourcenfressend.
--- Update ---
SqlBulkCopy ist richtig fix. Wir konnten Zeiten für den Test oben von rund 50 Sekunden erreichen. Vielen Dank für die guten Tipps!!!