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?
sql-server
sql-server-2008
performance
optimization
insert
Andrei Rînea
quelle
quelle
Antworten:
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.
quelle
Mein Rat ist, von einem Laptop abzusteigen. Stellen Sie dies auf eine echte Maschine mit schnellen Laufwerken und viel RAM.
quelle