Mehrere Zeilen mit einem einzigen INSERT in SQLServer 2008

8

Ich prüfe die Geschwindigkeit des Einfügens mehrerer Zeilen mit einer einzigen INSERT-Anweisung.

Zum Beispiel: INSERT IN [MyTable] VALUES (5, 'Hund'), (6, 'Katze'), (3, 'Fisch)

Das ist sehr schnell, bis ich 50 Zeilen mit einer einzigen Anweisung passiert habe, dann sinkt die Geschwindigkeit deutlich.

Das Einfügen von 10000 Zeilen mit 50er-Stapeln dauert 0,9 Sekunden. Das Einfügen von 10000 Zeilen mit Chargen von 51 dauert 5,7 Sekunden.

Meine Frage besteht aus zwei Teilen:

  1. Warum gibt es so eine harte Leistung bei 50?
  2. Kann ich mich auf dieses Verhalten verlassen und meine Anwendung so programmieren, dass niemals Stapel mit mehr als 50 Zeichen gesendet werden?

Meine Tests wurden in C ++ und ADO durchgeführt.

Bearbeiten: Es scheint, dass der Abgabepunkt nicht 50 Zeilen, sondern 1000 Spalten ist. Ich bekomme ähnliche Ergebnisse mit 50 Zeilen mit 20 Spalten oder 100 Zeilen mit 10 Spalten.

    
Todd 12.04.2010, 16:35
quelle

6 Antworten

2

Es könnte auch mit der Größe der Zeile zusammenhängen. Die Tabelle, die Sie als Beispiel verwenden, scheint nur zwei Spalten zu haben. Was ist, wenn es 25 Spalten hat? Sinkt die Leistung auch bei 50 Zeilen?

    
MJB 12.04.2010 19:09
quelle
0

Haben Sie sich auch mit dem hier gezeigten "union all" -Ansatz verglichen? Ссылка

Ich vermute, dass es einen internen Cache / Index gibt, der bis zu 50 Zeilen benutzt (es ist eine schöne runde Dezimalzahl). Nach 50 Zeilen wird auf einen weniger effizienten allgemeinen Algorithmus für die Einfügung von Groß- und Kleinbuchstaben zurückgegriffen, der beliebig viele Eingaben verarbeiten kann, ohne übermäßigen Speicher zu verwenden.

    
Mark B 12.04.2010 17:09
quelle
0

Die Verlangsamung ist wahrscheinlich das Parsen der String-Werte: VALUES (5, 'dog'), (6, 'cat'), (3, 'fish) und kein INSERT-Problem.

Versuchen Sie etwas wie dieses, das eine Zeile für jede von der Abfrage zurückgegebene Zeile einfügen wird:

%Vor%

und sehen was passiert

    
KM. 12.04.2010 17:19
quelle
0

Wenn Sie SQL 2008 verwenden, können Sie Tabellenwertparameter verwenden und nur eine einzige INSERT-Anweisung ausführen.

persönlich, ich habe nie die Verlangsamung bei 50 Inserts Aufzeichnungen selbst mit regelmäßigen Chargen gesehen. Ungeachtet dessen sind wir zu Tabellenwertparametern übergegangen, die für uns eine deutliche Geschwindigkeitssteigerung aufwiesen.

    
NotMe 12.04.2010 17:23
quelle
0
___ answer2623953 ___

Die Verlangsamung ist wahrscheinlich das Parsen der String-Werte: %code% und kein INSERT-Problem.

Versuchen Sie etwas wie dieses, das eine Zeile für jede von der Abfrage zurückgegebene Zeile einfügen wird:

%Vor%

und sehen was passiert

    
___ qstnhdr ___ Mehrere Zeilen mit einem einzigen INSERT in SQLServer 2008 ___ answer2623897 ___

Haben Sie sich auch mit dem hier gezeigten "union all" -Ansatz verglichen? Ссылка

Ich vermute, dass es einen internen Cache / Index gibt, der bis zu 50 Zeilen benutzt (es ist eine schöne runde Dezimalzahl). Nach 50 Zeilen wird auf einen weniger effizienten allgemeinen Algorithmus für die Einfügung von Groß- und Kleinbuchstaben zurückgegriffen, der beliebig viele Eingaben verarbeiten kann, ohne übermäßigen Speicher zu verwenden.

    
___ qstntxt ___

Ich prüfe die Geschwindigkeit des Einfügens mehrerer Zeilen mit einer einzigen INSERT-Anweisung.

Zum Beispiel: INSERT IN [MyTable] VALUES (5, 'Hund'), (6, 'Katze'), (3, 'Fisch)

Das ist sehr schnell, bis ich 50 Zeilen mit einer einzigen Anweisung passiert habe, dann sinkt die Geschwindigkeit deutlich.

Das Einfügen von 10000 Zeilen mit 50er-Stapeln dauert 0,9 Sekunden. Das Einfügen von 10000 Zeilen mit Chargen von 51 dauert 5,7 Sekunden.

Meine Frage besteht aus zwei Teilen:

  1. Warum gibt es so eine harte Leistung bei 50?
  2. Kann ich mich auf dieses Verhalten verlassen und meine Anwendung so programmieren, dass niemals Stapel mit mehr als 50 Zeichen gesendet werden?

Meine Tests wurden in C ++ und ADO durchgeführt.

Bearbeiten: Es scheint, dass der Abgabepunkt nicht 50 Zeilen, sondern 1000 Spalten ist. Ich bekomme ähnliche Ergebnisse mit 50 Zeilen mit 20 Spalten oder 100 Zeilen mit 10 Spalten.

    
___ answer2623982 ___

Wenn Sie SQL 2008 verwenden, können Sie Tabellenwertparameter verwenden und nur eine einzige INSERT-Anweisung ausführen.

persönlich, ich habe nie die Verlangsamung bei 50 Inserts Aufzeichnungen selbst mit regelmäßigen Chargen gesehen. Ungeachtet dessen sind wir zu Tabellenwertparametern übergegangen, die für uns eine deutliche Geschwindigkeitssteigerung aufwiesen.

    
___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ tag123sql ___ Structured Query Language (SQL) ist eine Sprache für die Abfrage von Datenbanken. Fragen sollten Codebeispiele, Tabellenstruktur, Beispieldaten und ein Tag für die verwendete DBMS-Implementierung (z. B. MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 usw.) enthalten. Wenn sich Ihre Frage nur auf ein bestimmtes DBMS bezieht (verwendet bestimmte Erweiterungen / Funktionen), verwenden Sie stattdessen das Tag des DBMS. Antworten auf mit SQL gekennzeichnete Fragen sollten den ISO / IEC-Standard SQL verwenden. ___ tag123ado ___ Microsoft ActiveX Data Objects (ADO) ist ein COM-basiertes Paket für den Zugriff auf Datenbanken wie SQL Server oder Datenquellen wie Excel-Tabellen. ADO.NET bietet Verbesserungen gegenüber ADO und die Integration mit .NET Framework für .NET-Entwickler. ADO.NET-Tag sollte für ADO.NET-spezifische Fragen verwendet werden. ___ answer2625531 ___

Verwenden Sie für hochvolumige und hochfrequente Inserts die Bulk-Inserts , um Ihre zu laden Daten. Nicht die einfachste Sache in der Welt zu implementieren und es bringt eine neue Reihe von Herausforderungen, aber es kann viel schneller sein als eine INSERT.

    
___ answer2624642 ​​___

Zufällige Gedanken:

  • ist es vollständig konsistent, wenn es wiederholt ausgeführt wird?
  • suchen Sie nach Duplikaten in den ersten 10k Zeilen für den 2. 10k Einsatz?
  • haben Sie zuerst eine Chargengröße von 51 probiert?
  • Haben Sie den Tisch zwischen den Tests leer?
___ answer2624658 ___

Es könnte auch mit der Größe der Zeile zusammenhängen. Die Tabelle, die Sie als Beispiel verwenden, scheint nur zwei Spalten zu haben. Was ist, wenn es 25 Spalten hat? Sinkt die Leistung auch bei 50 Zeilen?

    
___
gbn 12.04.2010 19:07
quelle
0

Verwenden Sie für hochvolumige und hochfrequente Inserts die Bulk-Inserts , um Ihre zu laden Daten. Nicht die einfachste Sache in der Welt zu implementieren und es bringt eine neue Reihe von Herausforderungen, aber es kann viel schneller sein als eine INSERT.

    
John Dibling 12.04.2010 21:18
quelle

Tags und Links