Millionen Einsätze: SqlBulkCopy Timeout

8

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

erstellt

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:

  • Es wurde versucht, eine Massenkopie für ein Objekt mit einer ausstehenden Operation aufzurufen.

ODER

  • Die Warteoperation ist abgelaufen (für den IDataReader)

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?

    
billybob 09.12.2014, 18:17
quelle

2 Antworten

10

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.

    
Spock 16.12.2014, 05:01
quelle
1

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.

    
Deepesh 14.09.2015 15:04
quelle