Wir haben bereits ein laufendes System, das alle Verbindungszeichenfolgen behandelt ( db2 , oracle , MSServer ).
Derzeit verwenden wir ExecuteNonQuery()
, um einige Einfügungen durchzuführen.
Wir möchten die Leistung verbessern, indem wir SqlBulkCopy()
anstelle von ExecuteNonQuery()
verwenden. Wir haben einige Kunden, die mehr als 50 Millionen Datensätze haben.
Wir möchten SSIS nicht verwenden, da unser System mehrere Datenbanken unterstützt.
Ich habe ein Beispielprojekt erstellt, um die Leistung von SqlBulkCopy()
zu testen. Ich habe eine einfache Lese- und Einfügefunktion für MSServer
Hier ist die kleine Funktion:
%Vor%Wenn ich weniger als 200 000 in meinem DummyTable habe, funktioniert die Massenkopie gut. Aber wenn es über 200 000 Datensätze gibt, habe ich folgende Fehler:
ODER
Ich habe das CommandTimeout für den Leser erhöht. Es scheint, dass es das Timeout-Problem im Zusammenhang mit IDataReader gelöst hat.
Mache ich etwas falsch im Code?
Können Sie versuchen, vor dem Aufruf von WriteToServer ... Folgendes hinzuzufügen:
%Vor%Ich weiß nicht, was die Standard-Batchgröße oder das Zeitlimit ist, aber ich vermute, dass dies Ihr Problem sein könnte. Hoffe das hilft
Sie können auch versuchen, mit verschiedenen Batch-Größen zu spielen, um eine optimale Leistung zu erzielen.
Sie können dies versuchen
bc.BatchSize = 100.000; // Wie viel Anzahl von Zeilen Sie gleichzeitig einfügen möchten.
bc.BulkCopyTimeout = 60; // Zeit in Sekunden, Wenn Sie eine unendliche Wartezeit haben wollen, dann vergeben Sie 0.
Ich hoffe, dass dies Ihnen und anderen Entwicklern hilft.
Tags und Links sql-server c# sqlbulkcopy bulkinsert sqldatareader