Die SQL Server-Indexfragmentierung ist eine häufige Ursache für Leistungseinbußen bei Datenbanken. Fragmentierung tritt auf, wenn auf einer Datenseite viel leerer Platz vorhanden ist (interne Fragmentierung) oder wenn die logische Reihenfolge der Seiten im Index nicht mit der physischen Reihenfolge der Seiten in der Datendatei übereinstimmt (externe Fragmentierung).
Fragmentierungsbezogene Leistungsprobleme werden am häufigsten beobachtet, wenn Abfragen ausgeführt werden, die Indexscans durchführen. Abfragen, die Indexsuchen durchführen, sind möglicherweise nicht von einer hohen Indexfragmentierung betroffen.
Die Arten der SQL Server-Indexfragmentierung verstehen
Interne Indexfragmentierung
Interne Fragmentierung tritt auf, wenn Datenseiten zu viel freien Speicherplatz haben. Dieser zusätzliche Platz wird auf verschiedenen Wegen eingeführt:
- SQL Server speichert Daten auf 8-KB-Seiten. Wenn Sie also weniger als 8 KB Daten in eine Tabelle einfügen, bleibt auf der Seite ein leerer Platz.
- Umgekehrt, wenn Sie mehr Daten einfügen, als auf der Seite Platz ist, wird der Überschuss an eine andere Seite gesendet. Es ist unwahrscheinlich, dass die zusätzlichen Daten die nachfolgenden Seiten perfekt ausfüllen, sodass Sie wieder einen leeren Platz auf einer Seite haben.
- Leerzeichen auf einer Datenseite treten auch auf, wenn Daten aus einer Tabelle gelöscht werden.
Interne Fragmentierung verursacht hauptsächlich Leistungsprobleme, wenn SQL Server einen Indexscan durchführt. Die Leistung wird langsamer, wenn SQL Server viele teilweise gefüllte Seiten scannen muss, um die gesuchten Daten zu finden.
Externe Indexfragmentierung
Externe Fragmentierung ist das Ergebnis von Datenseiten, die nicht in der richtigen Reihenfolge sind. Dies wird durch das Einfügen oder Aktualisieren von Daten auf vollständigen Blattseiten verursacht. Wenn einer ganzen Seite Daten hinzugefügt werden, erstellt SQL Server eine Seitenteilung, um die zusätzlichen Daten aufzunehmen, und die neue Seite wird von der Originalseite getrennt.
Die externe Fragmentierung verursacht Leistungsprobleme, indem sie zufällige E/A erhöht. Wenn Seiten nicht sequenziell sind, muss SQL Server Daten von mehreren Speicherorten lesen, was zeitaufwändiger ist als das Lesen der Reihe nach.
So vermeiden Sie die Indexfragmentierung von SQL Server
Es ist nicht möglich, die Indexfragmentierung vollständig zu verhindern, aber es gibt Möglichkeiten, ihr Auftreten zu minimieren und die Auswirkungen der Fragmentierung auf die Datenbankleistung zu verringern. Hier sind einige Gebote und Verbote, um die Indexfragmentierung von SQL Server zu vermeiden:
TUN: Wählen Sie Cluster-Schlüssel mit ständig steigenden oder fallenden Werten. Dadurch werden Seitenteilungen reduziert, da beim Einfügen von Datensätzen diese am Anfang oder am Ende der logischen Seitenkette platziert werden.
NICHT: Datensätze mit zufälligen Schlüsselwerten einfügen. Wählen Sie statische Schlüsselwerte, damit ein einmal platzierter Datensatz niemals verschoben werden muss und nicht in Unordnung gerät.
NICHT: Aktualisieren Sie Datensätze, um sie länger zu machen. Das Hinzufügen von Datensätzen zu einem Index während einer Aktualisierung erfordert möglicherweise, dass SQL Server einige der Daten auf eine neue Seite überträgt. Dies kann zu nicht sequenziellen Blattseiten und schließlich zu Leistungsproblemen führen.
NICHT: Indexschlüsselspalten aktualisieren. Schlüsselspaltenaktualisierungen erfordern eine vollständige Zeilenlöschung, gefolgt von einer vollständigen Zeileneinfügung unter Verwendung des neuen Schlüsselwerts. Wenn die neue Zeile auf einer Seite ohne genügend Platz eingefügt wird, erhalten Sie eine Seitenteilung.
TUN: Achten Sie auf Funktionen, die zu Seitenaufteilungen führen können. Denken Sie an die potenziellen Endergebnisse der Änderung von Funktionen, die Indizes betreffen. Beispielsweise kann das Aktualisieren von Spalten mit variabler Breite (selbst in Nicht-Schlüsselspalten) in einem gruppierten Index zu Seitenaufteilungen führen.
TUN: Implementieren Sie geeignete Indexfüllfaktoren. Analysieren Sie die Fragmentierung bei der Standardeinstellung für den Füllfaktor und passen Sie sie nach Bedarf an, um eine übermäßige Fragmentierung bei normaler Last zu minimieren.
So beheben Sie die SQL Server-Indexfragmentierung
Da es unmöglich ist, die Fragmentierung zu 100 % zu verhindern, ist es wichtig zu wissen, wie die SQL Server-Indexfragmentierung behoben werden kann, wenn die Leistung leidet.
Bevor Sie entscheiden können, wie Sie Ihr SQL Server-Indexfragmentierungsproblem angehen, müssen Sie zunächst feststellen, wie umfangreich ein Problem ist, mit dem Sie es zu tun haben.
Der beste Ausgangspunkt ist die Verwendung der DMF sys.dm_db_index_physical_stats, um den Fragmentierungsgrad Ihrer Indizes zu analysieren. Sobald Sie wissen, wie umfangreich die Indexfragmentierung ist, können Sie Ihren Angriffsplan mit einer von drei Lösungen planen:Index neu erstellen, Index neu organisieren oder nichts tun.
Neu erstellen: Erstellen Sie Indizes neu, wenn die Fragmentierung mehr als 30 % erreicht.
Neu organisieren: Reorganisieren Sie Indizes mit einer Fragmentierung zwischen 11 und 30 Prozent.
Ignorieren: Fragmentierungsgrade von 10 % oder weniger sollten kein Leistungsproblem darstellen, Sie müssen also nichts unternehmen.
Die SQL Server-Indexfragmentierung ist unvermeidlich, aber Sie können die negativen Auswirkungen der Fragmentierung auf die Datenbankleistung minimieren. Befolgen Sie einige einfache Best Practices und behalten Sie den Überblick über geplante Wartungsarbeiten, um größere Leistungsprobleme im Zusammenhang mit Fragmentierung zu mindern.