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:
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.
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.
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.
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
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.
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:
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.
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.
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.
Zufällige Gedanken:
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?
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.