4 Stimmen

Warum ist BCP so schnell?

BCP zum Einfügen von Daten in eine SQL Server DB ist sehr sehr schnell. Was macht es so schnell?

11voto

keithwarren7 Punkte 13828

In SQL Server wird die BCP-Eingabe sehr unterschiedlich protokolliert als traditionelle INSERT-Anweisungen. Wie SQL entscheidet, Dinge zu behandeln, hängt von einer Reihe von Faktoren ab, von denen einige Dinge sind, die die meisten Entwickler noch nicht einmal in Betracht ziehen, wie zum Beispiel welches Wiederherstellungsmodell die Datenbank verwenden soll.

bcp verwendet die gleiche Einrichtung wie die BULK INSERT und die SqlBulkCopy-Klassen.

Weitere Details hier http://msdn.microsoft.com/en-us/library/ms188365.aspx

Das Fazit ist, dass diese Massenoperationen weniger Daten protokollieren als normale Operationen und die Möglichkeit haben, SQL Server anzuweisen, seine traditionellen Prüfungen und Ausgewogenheiten bei den eingehenden Daten zu ignorieren. All diese Dinge zusammen tragen dazu bei, dass es schneller ist.

0 Stimmen

Interessant. Ich nehme an, wenn ich die SQLBulkCopy-Klasse verwende, würde ich die gleiche Art von Funktionalität bekommen... das könnte der Weg sein, den ich einschlage

8voto

Will Hartung Punkte 110997

Es betrügt.

Es hat intime Kenntnisse über die Interna und ist in der Lage, Ihre Eingabedaten direkter auf diese Interna zuzuordnen. Es kann andere zeitaufwändige Operationen überspringen (wie das Parsen, Optimierung, Transaktionen, Protokollierung, das Zurückstellen von Indizes, Isolierung). Es kann Annahmen treffen, die auf jede Zeile von Daten zutreffen, die ein normaler INSERT-SQL-Befehl nicht kann.

Im Grunde genommen ist es in der Lage, einen Großteil der Funktionalität zu überspringen, die eine Datenbank ausmacht, und dann am Ende im großen Stil aufräumen.

3 Stimmen

Nur wollte hinzufügen, dass es auch alle Auslöser auf der Tabelle überspringt, es sei denn, Sie sagen es nicht.

3voto

Joel Coehoorn Punkte 377088

Der Hauptunterschied, den ich zwischen bcp und einem normalen Insert kenne, ist, dass bcp keinen separaten Transaktions-Logeintrag für jede einzelne Transaktion benötigt.

0 Stimmen

Gibt es eine Möglichkeit, dieses Protokollieren auszuschalten, wenn ich einen normalen Insert durchführe?

0 Stimmen

@Tom Es gibt zwar Möglichkeiten, dies zu umgehen, aber es ist eine unglaublich schlechte Idee, es zu versuchen.

1voto

yucer Punkte 3621

Die Geschwindigkeit beruht darauf, dass der BCP-API des SQL Server Native Client ODBC-Treibers verwendet wird. Laut Microsoft:

http://technet.microsoft.com/en-us/library/aa337544.aspx

Das bcp-Dienstprogramm (Bcp.exe) ist ein Befehlszeilentool, das das Bulk Copy Program (BCP)-API verwendet...

Referenz zu den Bulk Copy Funktionen:

http://technet.microsoft.com/en-us/library/ms130922.aspx

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X