Wir haben eine schreibintensive SQL-Datenbank (SQL Server 2008) und die Einfügegeschwindigkeit nimmt nach einiger Zeit ab. Ich habe diese ähnlichen Fragen gelesen: SQL Insert Speed , SQL: Was verlangsamt INSERTs, wenn nicht CPU oder IO? und INSERTs beschleunigen .
Außerdem habe ich diesen Beitrag über die Analyse der SQL Server-Leistung gelesen, der mir dabei half, Engpässe zu finden (z. B. durch Abfragen sys.dm_exec_requests
und sys.dm_os_wait_stats
), aber ich habe immer noch Schwierigkeiten, die Abfrageergebnisse zu interpretieren und das Problem zu beheben.
Zuerst begann ich mit der Abfrage der, sys.dm_exec_requests
die nur eine Sitzungs-ID (Auswahlabfrage) mit dem Status "running" zurückgab (dh ich fand KEINE SUSPENDED SESSIONS). Also, wenn nichts meine Beilage blockiert hat, warum wird es langsam?
Als nächstes habe ich sys.dm_os_wait_stats
Statistiken über alle Wartetypen überprüft. Das Ergebnis zeigte, dass LATCH_EX, CXPACKET UND PAGEIOLATCH_SH die meiste Wartezeit hatten (694379 ms, 310364 ms bzw. 308335 ms).
Dann fand ich sys.dm_os_latch_stats
den am weitesten verbreiteten Verriegelungstyp, der in meinem Fall war ACCESS_METHODS_DATASET_PARENT
.
- Erstens weiß ich nicht, wie ich die Abfrage für jede Sitzungs-ID in den Ergebnissen der Abfrage finden kann
sys.dm_exec_requests
. - Zweitens, wie viele Wartezeiten (in
sys.dm_os_wait_stats
) sollten als hoch angesehen werden? Und wenn die oben genannten Zahlen (Ergebnisse von sys.dm_os_wait_stats) hoch sind, wie kann ich sie verringern? - Soweit ich weiß,
ACCESS_METHODS_DATASET_PARENT
hängt dies mit Parallelität zusammen, und eine der Lösungen, die ich gefunden habe, war die Verringerung des Parallelitätsgrades. Ist das richtig? - In MySQL gibt es einige Tunning-Einstellungen, die direkt nach der Installation vorgenommen werden können (z. B. Erhöhen der Größe des Innodb-Pufferpools). Gibt es in SQL Server etwas Ähnliches?
Noch ein paar Infos:
Bei Verwendung
sys.dm_db_index_usage_stats
beträgt die Anzahl der Lese- und Schreibvorgänge 80336 bzw. 70672.Eine unserer am stärksten ausgelasteten Tabellen ist
trans_all
(mit allen Zahlungsvorgängen) ohne TRIGGERS, NO CONSTRAINTS (dies ist für alle Tabellen gleich), hat jedoch einen CLUSTERED INDEX, derPK_trans_all
aus den folgenden Spalten besteht: gs_id (smallint), pt_id (tinyint), tanking_time (datetime), purchase_type (tinyint).Die Datenbankgröße beträgt 2,6 GB und die
trans_all
Tabellengröße 155 MB.
UPDATE_1
In Bezug auf die habe ACCESS_METHODS_DATASET_PARENT
ich die Lösung ausprobiert, die ich gefunden habe (dh den Grad der Parallelität geändert. Ich habe sie in 1 geändert, um sicherzustellen, dass die Abfrage niemals zur Parallelität wechselt), aber das Problem wurde dadurch nicht behoben: | soll ich es nochmal ändern Was ist die Standardeinstellung, die ich verwenden soll?
UPDATE_2
Ich habe gerade die Größe der Transaktionsprotokolldatei für meine Datenbank überprüft, die 2,4 GB beträgt, und der verwendete% Protokollspeicher beträgt 98%. Könnte dies der Grund sein, meine Einsätze zu verlangsamen? Sollte ich die Größe der Protokolldatei erhöhen?
Außerdem habe ich sys.database_files
die Dateigröße und den leeren Speicherplatz für meine Datenbank überprüft. Das Ergebnis zeigt, dass die Dateigröße 195 MB und der leere Speicherplatz 0,187 MB beträgt .
gs_id, pt_id, fueling_time, purchase_type
) definiert ist ? Wenn ja, gehe ich davon aus, dass sich die Einfügungen nicht am Ende der Tabellen befinden, wie Sie gesagt haben, und dass während Ihrer Einfügungen eine große Anzahl von Seitenteilen auftritt.