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-
- Gibt es Gründe für eine periodische / zyklische Verlangsamung der Insert-Leistung?
- Werden Neuausgleichsvorgänge automatisch für Clustered-Indizes ausgelöst?
- 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 ...
NEWID()
aber das wird im Hauptteil der Frage nicht erwähnt. IstNEWID()
für diese Frage relevant?Antworten:
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 :
Weitere Informationen zu den Auswirkungen von chekcpoint auf die Leistung finden Sie unter SQL-Fragen und Antworten: Feinabstimmung für optimale Leistung :
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.
quelle
CHECKPOINT
.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.
quelle
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:
GETDATE()
.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
CHECKPOINT
Verhalten, 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:
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.quelle