it-swarm.com.de

Was ist die empfohlene Stapelgröße für SqlBulkCopy?

Was ist die empfohlene Stapelgröße für SqlBulkCopy? Ich suche nach einer allgemeinen Formel, die ich als Ausgangspunkt für die Leistungsoptimierung verwenden kann.

80
Jonathan Allen

Ich habe ein Importdienstprogramm, das sich auf demselben physischen Server befindet wie meine SQL Server-Instanz. Mit einem benutzerdefinierten IDataReader werden flache Dateien analysiert und mit SQLBulkCopy in eine Datenbank eingefügt. Eine typische Datei besteht aus ungefähr 6 Millionen qualifizierten Zeilen mit durchschnittlich 5 Dezimal- und Kurztextspalten und ungefähr 30 Bytes pro Zeile.

In diesem Szenario stellte ich fest, dass eine Stapelgröße von 5.000 der beste Kompromiss zwischen Geschwindigkeit und Speicherverbrauch ist. Ich habe mit 500 angefangen und mit größeren experimentiert. Ich habe festgestellt, dass 5000 im Durchschnitt 2,5-mal schneller sind als 500. Das Einfügen der 6 Millionen Zeilen dauert bei einer Stapelgröße von 5.000 etwa 30 Sekunden und bei einer Stapelgröße von 500 etwa 80 Sekunden.

10.000 war nicht messbar schneller. Durch das Verschieben auf bis zu 50.000 wurde die Geschwindigkeit um einige Prozentpunkte verbessert, aber die erhöhte Belastung des Servers lohnt sich nicht. Über 50.000 zeigten keine Geschwindigkeitsverbesserungen.

Dies ist keine Formel, sondern ein weiterer Datenpunkt, den Sie verwenden können.

89
Alric

Dies ist ein Thema, mit dem ich mich auch beschäftigt habe. Ich möchte den Import großer CSV-Dateien (über 16 GB, über 65 Millionen Datensätze) in eine SQL Server 2005-Datenbank mithilfe einer C # -Konsolenanwendung (.Net 2.0) optimieren. Wie Jeremybereits erwähnt hat, müssen Sie einige Feinabstimmungen für Ihre besonderen Umstände vornehmen, aber ich würde empfehlen, dass Sie eine anfängliche Stapelgröße von 500 haben und testen Werte darüber und darunter.

Ich habe die Empfehlung erhalten, Werte zwischen 100 und 1000 für die Chargengröße zu testen MSDN-Forumbeitrag , und war skeptisch. Beim Testen auf Chargengrößen zwischen 100 und 10.000 stellte ich jedoch fest, dass 500 der optimale Wert für meine Anwendung war. Der 500-Wert für SqlBulkCopy.BatchSize wird auch empfohlen hier .

Lesen Sie Folgendes, um Ihren SqlBulkCopy-Vorgang weiter zu optimieren: MSDN-Hinweis ; Ich finde, dass die Verwendung von SqlBulkCopyOptions.TableLock die Ladezeit verkürzt.

28
MagicAndi

Wie bereits erwähnt, hängt dies von Ihrer Umgebung ab, insbesondere vom Zeilenvolumen und der Netzwerklatenz.

Persönlich würde ich mit dem Setzen der Eigenschaft BatchSize auf 1000 Zeilen beginnen und sehen, wie sich dies auswirkt. Wenn es funktioniert, verdopple ich die Anzahl der Zeilen (z. B. auf 2000, 4000 usw.), bis eine Zeitüberschreitung auftritt.

Wenn andernfalls ein Timeout bei 1000 auftritt, verringere ich die Anzahl der Zeilen um die Hälfte (z. B. 500), bis es funktioniert.

In jedem Fall verdopple ich (falls erfolgreich) oder halbiere (falls fehlgeschlagen) die Differenz zwischen den beiden letzten versuchten Chargengrößen, bis ich einen Sweet Spot gefunden habe.

Der andere zu berücksichtigende Faktor ist, wie lange es dauert, einen einzelnen Zeilenstapel zu kopieren. Zeitüberschreitungen treten auf, wenn der Stapel der zu kopierenden Zeilen die Eigenschaft BulkCopyTimeout überschreitet, die standardmäßig 30 Sekunden beträgt. Sie können versuchen, die Eigenschaft BulkCopyTimeout auf 60 Sekunden zu verdoppeln. Dies ermöglicht einen längeren Zeitraum für das Kopieren eines größeren Satzes von Stapelzeilen. Zum Beispiel kann ein Stapel mit 50.000 Zeilen ungefähr 40 Sekunden dauern, wenn das Zeitlimit von 30 Sekunden überschritten wird, sodass eine Erhöhung auf 60 Sekunden die Leistung beeinträchtigen kann.

15
Ray Vega

Dies hängt alles von Ihrer Implementierung ab.

Welche Geschwindigkeit können Sie in Ihrem Netzwerk erwarten? Verwenden Sie es in Forms oder ASP.Net? Müssen Sie den Benutzer über den Fortschritt informieren? Wie groß ist der Gesamtjob?

Nach meiner Erfahrung führt das Ausführen einer Massenkopie ohne Angabe einer Stapelgröße zu Zeitüberschreitungsproblemen. Ich mag es, mit 1000 Datensätzen zu beginnen und von dort aus einige Anpassungen vorzunehmen.

4
Jeremy