SQL Server-Clustered-Index, Indexausgleich und Einfügeleistung mithilfe von NewID

7

Ich habe eine große (6db) Trace-Tabelle. Es verfügt über einen Clustered Key (DateTime), der über GETDATE () erstellt wird.

Der Verbindungspool für Verbindungen zu dieser Datenbank / Tabelle steigt auf einem Cluster von 10 Computern im Durchschnitt auf bis zu 50, sodass im Durchschnitt ~ 500 gleichzeitige Verbindungen versucht werden, diese einzufügen.

Die Datenbank passt in den Speicher und es werden kaum E / A-Vorgänge angezeigt.

Ich versuche herauszufinden, ob der Clustered-Index unter anhaltender INSERT-Last einen Punkt erreicht, an dem er den Baum neu ausbalanciert, und ob dies zu einer Verlangsamung der Anzahl der Einfügungen führt, die das System aufrechterhalten kann.

Ich habe einige Fragen, ob SQL Server das Neuausgleichen eines Index für einen Clustered-Index (und sogar für einen Nicht-Clustered-Index) durchführt.

Fragen-

  1. Gibt es Gründe für eine periodische / zyklische Verlangsamung der Insert-Leistung?
  2. Werden Neuausgleichsvorgänge automatisch für Clustered-Indizes ausgelöst?
  3. Werden Neuausgleichsvorgänge automatisch für nicht gruppierte Indizes ausgelöst?

Andere Information

  • SQL Server 2008
  • Wirklich großer Server - 256 GB, 40 Kerne, 40 MB LAN ...
Ravenor
quelle
Haben Sie einen Oracle-Hintergrund?
usr
2
Was ist "(6db)"? 6 GB?
Ypercubeᵀᴹ
1
Der Titel der Frage erwähnt, NEWID()aber das wird im Hauptteil der Frage nicht erwähnt. Ist NEWID()für diese Frage relevant?
Solomon Rutzky
Ich habe Oracle-, Postgres- und SQL Server-Hintergründe, bin jedoch kein DBA in Bezug auf die Rolle (Software Architect - Fokus auf Leistung und Skalierbarkeit).
Ravenor
NEWID () - ja - Entschuldigung. Ich erhielt zuerst falsche Informationen.
Ravenor

Antworten:

8

Gibt es Gründe für eine periodische / zyklische Verlangsamung der Insert-Leistung?

Ja. Kontrollpunktereignisse. Bei einer schreibintensiven Arbeitslast, einem großen RAM-Server, wie Sie beschreiben, sammelt sich eine große Anzahl von "schmutzigen" Seiten im Speicher an. Im vorgegebenen Prüfpunktintervall werden alle diese schmutzigen Seiten auf die Festplatte geschrieben, was zu einem Anstieg der E / A-Anforderungen führt. Dies verlangsamt wiederum die Protokoll-Commit-Schreibvorgänge, was sich in der Zunahme der INSERT-Antwortzeit äußert, die Sie regelmäßig beobachten. QED. Dies ist natürlich nur eine Vermutung, da keine ordnungsgemäße Untersuchung vorliegt. Für eine sicherere Antwort empfehlen wir Ihnen , die Analyse der SQL Server-Leistung zu lesen und die dort beschriebenen Techniken anzuwenden, um das Problem zu identifizieren.

Wenn das Problem tatsächlich durch einen Prüfpunkt verursacht wird, enthält SQL Server 2012 indirekte Prüfpunkte :

Indirekte Prüfpunkte, neu in SQL Server 2012, bieten eine konfigurierbare Alternative auf Datenbankebene zu automatischen Prüfpunkten. ... Indirekte Checkpoints reduzieren Checkpoint-bezogene E / A-Spitzen, indem sie im Hintergrund ständig schmutzige Seiten auf die Festplatte schreiben .

Weitere Informationen zu den Auswirkungen von chekcpoint auf die Leistung finden Sie unter SQL-Fragen und Antworten: Feinabstimmung für optimale Leistung :

Auf der Suche nach Spitzen
F. Ich behebe ein Problem, bei dem regelmäßig E / A-Spitzen von einem unserer SQL Server angezeigt werden. Ich habe es mit PerfMon auf Checkpoints eingegrenzt, kann aber nicht sagen, welche Datenbank der Hauptschuldige ist. Wie kann ich weiter bohren?

Vor SQL Server 2012 haben Sie die Möglichkeit, den Wert für das Wiederherstellungsintervall zu reduzieren . Dies erhöht die Häufigkeit von Prüfpunkten, verringert jedoch die Anzahl der schmutzigen Seiten, die jeder Prüfpunkt schreiben muss. Das Verteilen der Daten-E / A hilft (kaufen Sie mehr Spindeln). Das Trennen der Protokoll-E / A zu ihrem eigenen Pfad (eigene Spindel) hilft dem Prüfpunkt nicht, isoliert jedoch die Protokoll-Commits von den Effekten und hält das INSERT somit reaktionsfähig. SSDs wirken Wunder.

Ich würde von strukturellen Veränderungen abraten. Meiner Meinung nach haben Sie bereits den besten Clustered-Index für Zeitreihen. Jede strukturelle Änderung müsste durch eine Analyse der Grundursachenleistung unterstützt werden, die auf die aktuelle Struktur als Problem hinweist.

Remus Rusanu
quelle
+1 guter Punkt über CHECKPOINT.
Solomon Rutzky
Hervorragender Punkt. Ich habe lange Zeit nicht über E / A / Checkpoints nachgedacht - ein Ergebnis eines übergroßen EMC-Backends mit genügend Bandbreite, um 'The Matrix' zu überwältigen. Ich werde das überprüfen.
Ravenor
Offensichtlich kann eine peroidale, nicht SQL-bezogene Arbeitslast, die das Back-End erhöht, dies ebenfalls verursachen, unabhängig davon, was Ihre freundlichen Speicheradministratoren behaupten;)
Remus Rusanu
8

SQL Server "gleicht den Baum nicht neu aus" als periodisches Ereignis. Ich habe diesen Begriff zuletzt im Zusammenhang mit Oracle gehört. Alles, was SQL Server tut, erhöht bei Bedarf die Baumhöhe. Dies ist ein Ereignis, das in der gesamten Existenz eines B-Baums nur wenige Male auftritt.

In einer DML-Workload kann es viele kleine Baumanpassungen geben, die als Seitensplits bezeichnet werden. Diese sind in der Tat schädlich für die CPU- und E / A-Nutzung und können eine Fragmentierung verursachen. Wenn Sie in aufsteigender Datumsreihenfolge einfügen, tritt dieses Problem nicht auf, da der Baum "Anhängen" ein Sonderfall ist, für den SQL Server optimiert. In jedem Fall wirkt sich eine Seitenteilung nur auf eine Handvoll Seiten aus.

Keine periodisch auftretenden Baumoperationen.

Clustered-Indizes haben (fast) die gleiche Struktur wie nicht-Clustered-Indizes.

Es gelten alle üblichen Hinweise zum SQL Server B-Tree-Index: Wählen Sie den Schlüssel mit Bedacht aus (es scheint, als hätten Sie einen guten, der auf aufsteigenden Datums- / Uhrzeitwerten basiert) und verfügen Sie über eine Strategie zur Fragmentierung und zur Rückgewinnung von Speicherplatz bei Löschvorgängen.

usr
quelle
Entschuldigung, Sie haben Recht - ich muss das falsch verstanden haben .....
marc_s
Vielen Dank - exzellenter Input. Schade, dass ich nicht mehr als eine als Antwort markieren konnte - gab Ihnen eine Gegenstimme.
Ravenor
3

Es ist eine Situation , in Ihrem aktuellen Setup , das auf einen automatische Erhöhung Schlüssel (bezogen würde / könnte eine Verlangsamung verursachen IDENTITY, GETDATE(), NEWSEQUENTIALID()): unter hohen Nebenläufigkeit INSERT - Operationen, kann es Streit zu platzieren Zeilen auf derselben Seite verbunden sein. Dies wird als "Hotspot" bezeichnet und ist einer der wenigen Nachteile beim automatischen Inkrementieren von Werten, da diese von Natur aus direkt nebeneinander liegen.

Ich fand widersprüchliche Informationen darüber, ob das "Hotspot" -Problem noch relevant war oder nicht:

Zu diesen drei Links sind einige interessante Dinge zu beachten:

  1. Einige der Antworten in dieser DBA.SE-Frage erwähnen die beiden anderen obigen Links. @Gbn weist darauf hin, dass der Artikel, der zeigt, dass das Hotspot-Problem weiterhin besteht, "einen nicht eindeutigen Clustered-Index für TranTime verwendet. Dazu muss ein Eindeutiger hinzugefügt werden. Dies bedeutet, dass der Index nicht streng monoton ansteigt (und zu breit ist). . "
  2. Technisch gesehen existiert der Eindeutigkeitswert (und damit der von diesem verborgenen Feld belegte Platz) nur in Zeilen, die nicht eindeutig sind. Daher ist es möglich, Zeilen einzeln in einem einzelnen Thread hinzuzufügen, und es wären eindeutige Werte, die ständig zunehmen würden, und es gäbe keinen eindeutigen Wert.
  3. Bei diesem Test wurden jedoch 400 gleichzeitige Verbindungen simuliert, bei denen der Testprozess 200 Mal ausgeführt wurde (ich nehme an, pro Verbindung). Daher ist es sehr wahrscheinlich, dass mehrere dieser INSERT-Vorgänge in derselben Millisekunde ausgeführt wurden und denselben Wert von erhalten haben GETDATE().
  4. Ergo mag es angebracht sein, diesen bestimmten Test als ungültig in Bezug auf "Treten Hotspots auf, wenn ein eindeutiger, immer größer werdender Wert als Clustered-Index verwendet wird?" Auszuschließen, aber dieser Test könnte hier von hoher Relevanz sein. Die Beschreibung des Index in dieser Frage lautet, dass er "einen Clustered Key (DateTime) hat, der über GETDATE () erstellt wird". Es scheint sicher anzunehmen, dass der Index in dieser Frage nicht eindeutig ist (insbesondere wenn es sich nur um dieses eine DATETIME-Feld handelt). Und er hat 400 gleichzeitige Verbindungen getestet, während diese Frage besagt, dass es ungefähr 500 gleichzeitige Verbindungen gibt? Das klingt nach einem sehr ähnlichen Setup. Es ist daher sinnvoll, dasselbe Skript "SQL Server Perf Stats" auszuführen, um festzustellen, ob auch ähnliche LATCH-Konflikte auftreten.

Eine andere zu berücksichtigende Sache ist, dass die Indexpflege (REBUILD / REORGANIZE) zwar nicht automatisch erfolgt, die Statistik jedoch aktualisiert wirderfolgt automatisch (bei einer gleitenden Skala von% der geänderten Zeilen). Dies ist die Standardeinstellung für Datenbanken, es sei denn, Sie setzen "Auto Update Statistics" auf "false". Es gibt eine verwandte Option, die standardmäßig "false" ist und "Statistiken automatisch aktualisieren", die während dieses automatischen Aktualisierungsvorgangs keine Blockierung verursacht. Die durch die automatische Aktualisierung der Statistik verursachte Blockierung tritt während der Planerstellung für alle Pläne auf, die Informationen zu der bestimmten Statistik benötigen, die zu diesem Zeitpunkt aktualisiert wird. Mit der Option "Statistiken asynchron automatisch aktualisieren" kann das Abfrageoptimierungsprogramm Statistiken verwenden, von denen bekannt ist, dass sie veraltet sind und aktualisiert werden. Sobald die Statistiken aktualisiert sind, werden sie verwendet.

Eine andere Sache, die eine periodische Verlangsamung von INSERTs (sowie einiger UPDATEs) verursachen kann, ist das automatische Wachstum der Daten- und Protokolldateien. Offensichtlich wächst das Trans-Log auch bei DELETE-Operationen. Für INSERT-Vorgänge und UPDATE-Vorgänge, bei denen die neue Zeile größer als die vorherige Version dieser Zeile ist, müssen möglicherweise neue Seiten zugewiesen werden, wenn auf der entsprechenden Seite kein Platz mehr vorhanden ist. Wenn kein Speicherplatz mehr zum Zuweisen der Seite verfügbar ist, versucht SQL Server, die Datendatei zu vergrößern (sofern dies nicht deaktiviert wurde). Während die Daten- (oder Protokoll-) Datei vergrößert wird, werden Vorgänge für diese Datei blockiert. Aus diesem Grund ist es wichtig, die Datendateien richtig zu dimensionieren, damit die darin enthaltenen Tabellen wachsen können, ohne dass eine automatische Vergrößerung erforderlich ist oder zumindest nicht häufig.

Der Vollständigkeit halber gibt es das CHECKPOINTVerhalten, auf das @Remus in einer anderen Antwort auf diese Frage hingewiesen hat.


Es ist zu beachten, dass Seitensplits keine Funktion von DML-Operationen im Allgemeinen oder unter hoher Last sind. Sie sind eine Funktion von:

  1. (die Reihenfolge, in der Daten eingefügt werden, ODER
  2. eine Erhöhung der Zeilengröße für aktualisierte Daten) UND
  3. ob auf der entsprechenden Seite Platz für eines dieser Ereignisse vorhanden ist oder nicht

Single-Threaded-INSERT-Operationen eines Schlüssels mit automatischer Inkrementierung sollten niemals zu einer Seitenteilung führen. INSERT-Operationen mit mehreren Threads eines Schlüssels mit automatischer Inkrementierung könnten (glaube ich) in einem hochvolumigen, gleichzeitigen INSERT-Szenario in der falschen Reihenfolge ausgeführt werden (und daher möglicherweise einen Seitensplit verursachen), je nachdem, ob der Scheduler (das SQL-Betriebssystem) Multithreading) würde so etwas wie das Zuweisen des Werts aus dem tun, GETDATE()aber dann diesen Thread in die Warteschleife stellen, während ein anderer eingefügt wird, um dann für die eigentliche Einfügung zu diesem zurückzukehren. Ich habe das "Wenn" hervorgehoben, da ich nicht bewiesen habe, dass dies geschieht. Und UPDATE-Vorgänge sollten auf keinem Volume Seitenaufteilungen verursachen, wenn die Zeilengröße nicht zunimmt.

Solomon Rutzky
quelle
1
Vielen Dank - ausgezeichneter Kommentar und Rücksichtnahme auf Latches et al. Ich bedauere, dass ich nur eine Frage als richtig markieren kann - Sie haben eine wohlverdiente Gegenstimme erhalten.
Ravenor