INSERTs beschleunigen


7

Ich muss eine Möglichkeit haben, schnell, synchron und mit minimaler Dauer in eine Tabelle einzufügen. Was ich versucht habe ("blind") ist:

  • Habe überhaupt keinen Index auf dem Tisch
  • Wechseln Sie zur einfachen Protokollierung (von der vollständigen Protokollierung)

Das von mir verwendete Testszenario besteht aus 100 Verbindungen, die jeweils ein INSERT ausführen und dann 0,1 Sekunden und dann erneut auf unbestimmte Zeit warten. Jeder "Inserter" protokolliert die Ausführungszeit.

Wenn ich mir die Ausführungszeiten ansehe, sehe ich manchmal 1,5 und sogar 10 Sekunden auf einem Einsatz (als Ausnahmefälle), ansonsten sehe ich typische 0,2 Sekunden.

Weiterer Kontext:

  • SQL Server 2008 R2 Express (afaik die Express-Version beschränkt nur DB-Größe (4 GB), RAM (1 GB) und logische CPUs (1))
  • Maschine: Laptop mit 7200 U / min Festplatte, 8 GB RAM und 8 logischen CPUs, Hosting des Servers und der Clients
  • Die Tabelle besteht aus 1 BigInt ID (Identität), einem NVARCHAR (100) -Feld und NVARCHAR (MAX) (INSERTs mit einer Nutzlast von 10.000) und einer NVARCHAR (MAX) (30.000 Nutzlast bei INSERT).

Wo sollte ich nach weiteren Verbesserungen der Leistung eines solchen Prozesses suchen?


Kommentare sind nicht für eine ausführliche Diskussion gedacht. Dieses Gespräch wurde in den Chat verschoben .
Paul White 9

Antworten:


6

Viele Leute haben in den Kommentaren viele gute Punkte hinzugefügt.

1) Trennen Sie Ihre Transaktionsprotokolle auf einem anderen Laufwerk. Mit einem Laptop wird das schwierig. Wenn Sie das nicht können, besorgen Sie sich eine SSD für den Laptop, und das sollte Ihr Leben erheblich verbessern.

2) Erweitern Sie Ihre Daten und Protokolldateien vorab auf eine Zielmenge. Wenn Sie erwarten, 1 GB Daten zu Ihrer Datenbank hinzuzufügen, müssen Sie Ihre Daten- und Protokolldateien mindestens 1,5 GB groß machen, um zu beginnen. Das automatische Wachstum von Daten und Protokolldateien ist ein Killer für die Leistung und kann sehr wohl der Grund sein, warum Sie diese 10-Sekunden-Drosseln in der Leistung sehen. In SQL Management Studio sind einige Berichte integriert (ich glaube, Sie klicken mit der rechten Maustaste auf die Datenbank und wählen dann Berichte -> Datenträgernutzung), in denen eine Tabelle aller Ihrer Autogrow-Ereignisse enthalten sein sollte.)

3) Wenn Sie Ihre Einfügungen auf Client-Basis stapeln können, verwenden Sie dazu die Anweisung SqlBulkCopy oder BULK INSERT.

4) Es sollte keinen Grund geben, warum Ihre Tabellen keinen gruppierten Primärschlüssel haben sollten. SQL Server sollte in der Lage sein, einen Clustered-Index für Ihre IDENTITY-Spalte auf ziemlich performante Weise zu verarbeiten.


1
Partitionierung scheint hier übertrieben, und es ist viel komplizierter zu entwerfen und zu warten, dass nur "eine Partition darauf zu setzen wird schneller sein"
JNK

1

Mein Rat ist, von einem Laptop abzusteigen. Stellen Sie dies auf eine echte Maschine mit schnellen Laufwerken und viel RAM.


Ich bin mir sicher, dass dies helfen würde, aber ich habe auf dem Laptop getestet, um festzustellen, wo Engpässe auftreten und was die ersten und einfachsten Schritte sind, um die Dinge zu verbessern, bevor ich über eine Skalierung nachdachte.
Andrei Rînea

Das Problem bei Ihrem Ansatz ist, dass sich Laptops und Server aus Sicht der internen Architektur grundlegend unterscheiden.
Datum

... und ich kann nicht feststellen, wie ich etwas beschleunigen kann, das auf einem Server ausgeführt wird, wenn ich auf einem Laptop teste?
Andrei Rînea

1
Sie können, aber Sie werden möglicherweise Zeit damit verschwenden, Engpässe zu überwinden, die durch den Laptop selbst verursacht werden. Es ist wie bei einem olympischen Läufer, der die Leute bittet, seine Form zu kommentieren und nach Möglichkeiten zu fragen, wie er seine Zeit auf der Strecke verbessern kann, während er Tauchausrüstung trägt.
Datum

3
Ihre Engpässe auf dem Laptop sind wahrscheinlich sehr unterschiedlich (und variabel!) Im Vergleich zu einem richtigen Server. Wenn Sie einen Stresstest durchführen möchten, führen Sie ihn zumindest auf einem Gerät aus, das als Server eingerichtet ist und auf dem sonst nichts ausgeführt wird. Sie werden wahrscheinlich auf RAM / CPU-Engpässe auf einem Laptop stoßen, der auf einer Produktionsmaschine möglicherweise nicht vorhanden ist
Ben Brocka
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.