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.Antworten:
Es gibt viele Faktoren, die diese Verlangsamung der Einsätze verursachen können, wie Sie beschrieben haben.
Etwas, das ich in Ihren Informationen nicht sehe, ist die Datenbank- / Tabellengröße, in die die Einfügungen gehen. Je größer die Tabelle wird, desto länger dauern Ihre Einfügungen aufgrund der Tabellengröße, der Fragmentierung und des Schreibens derselben Daten in Ihre Indizes.
Die DM-Abfragen, die Sie ausführen, haben Ihnen einige gute Informationen gegeben. Ich würde auch empfehlen, das Toolkit von Brent Ozar zu verwenden. Verknüpfung
Ich würde vorschlagen, dass Sie SP_BlitzIndex und SP_BlitzCache verwenden. Diese geben Ihnen einen weiteren Überblick darüber, was tatsächlich in der Datenbank geschieht und was die von Ihnen ausgeführten Einfügeabfragen zu diesem Zeitpunkt tun.
Ich würde auch überprüfen, wann das letzte Mal eine DBCC-CHECKDB ausgeführt wurde und wann Sie Ihre Indizes und Statistiken zuletzt neu erstellt haben.
Vielen Dank für die Updates, siehe unten:
Noch ein paar Infos:
Nicht viel Lesen / Schreiben, also bin ich nicht zu besorgt.
Wissen Sie, wann der trans_all-Index das letzte Mal neu erstellt wurde? Wenn Sie nur einen Deckungsindex und viele Einfügungen haben, dauert das Einfügen von Daten jedes Mal länger, wenn diese veraltet sind. Im Folgenden finden Sie eine Abfrage zum Überprüfen der Fragmentierung Ihrer Datenbanktabellen:
UPDATE 1:
MAX DOP-Einstellungen können sich auf Ihre Abfragelaufzeit auswirken, aber ich kann nicht sicher sein, ob dies der Fall ist, ohne die von Ihnen verwendete Abfrage zu sehen und dann die geschätzten Planergebnisse zu überprüfen, um festzustellen, was SQL Server verwendet. Es gibt zwei Statistiken, mit denen Sie herausfinden können, wie die Abfrage beim Anpassen des MAX DOP beeinflusst wird.
Hier sind einige Informationen von Kendra Little bei Brent Ozar, wie Sie diese verwenden können, um Ihnen Richtlinien zu geben.
tsql-Measure-Performance-Verbesserungen
und
q-can-high-maxdop-make-a-query-langsamer
UPDATE 2:
Ich würde empfehlen, die Protokollgröße zu erhöhen, wenn sie zu 98% voll ist. Fügen Sie entweder ein weiteres Protokoll hinzu oder erhöhen Sie es. Sie können sich auch TEMP_DB ansehen und sehen, was es tut, weil SQL dies als Speicherplatz für viele Dinge verwendet.
Leerer Raum ist kein wirkliches Problem, es sei denn, Sie haben keinen Platz mehr zum Wachsen. Es sagt Ihnen nur, wie viel Platz bis zum nächsten automatischen Wachstum übrig bleibt.
quelle
ACCESS_METHODS_DATASET_PARENT
als Ergebnis von gesehen habesys.dm_os_latch_stats
? Ich meine, wenn es nicht das Problem war, warum ich dmv verwenden musste?Wenn Ihre Datenbank per Protokoll versendet wird, kann es sein, dass das Protokoll mit Transaktionen gefüllt wird. Warten Sie dann bis zur nächsten Protokollsicherung, bevor Sie sie bereinigen und Platz für neue Transaktionen schaffen, um die Verarbeitung fortzusetzen. Versuchen Sie, die Lücke zwischen den Versandperioden des Protokolls zu verringern oder die Größe der Protokolldatei zu erhöhen. Es gibt noch andere Dinge, die Sie tun können, wie das Überprüfen der Indexnutzungsstatistiken und das Entfernen nicht verwendeter Indizes. Ihre Wartung führt zu zusätzlichen Anforderungen an das Protokoll.
quelle