Wie kann ich feststellen, wann meine SQLServer-Datenbank defragmentiert werden muss?

9

Was ist die beste Vorgehensweise zum Messen der Fragmentierung / des Leistungsabfalls der SQLServer-Datenbank und zum Bestimmen, wann eine SQLServer-Datenbanktabelle defragmentiert werden muss?

Ich bin am meisten daran interessiert zu erfahren, was die nützlichen Metriken sind und welcher Grad der Leistungsverschlechterung die Defragmentierung auslösen sollte.

Jeff Leonard
quelle

Antworten:

22

Ich bin mir sicher, dass es einige interessante Antworten darauf geben wird, da es viele Meinungsverschiedenheiten darüber gibt, welche Metriken zu betrachten sind. Ich habe DBCC INDEXDEFRAG, SHOWCONTIG geschrieben und deren Ersatz für 2005 entworfen sowie den Inhalt von Books Online geschrieben, damit ich Ihnen meine Ansicht geben und die Zahlen in Books Online und den von mir ausgewählten Wartungsplan-Assistenten für 2005 erläutern kann.

Die zwei besten Metriken für die Indexfragmentierung sind: 1) (2005) durchschnittliche Fragmentierung in Prozent / (2000) logische Scanfragmentierung 2) (2005) durchschnittliche Seitendichte / (2000) durchschnittliche freie Bytes pro Seite

Diese gelten gleichermaßen für gruppierte und nicht gruppierte Indizes.

1 misst, wie viel logische Fragmentierung vorhanden ist. In diesem Fall stimmt die logische Reihenfolge der Seiten auf Blattebene eines Index nicht mit der physischen Reihenfolge überein. Dies verhindert, dass die Storage Engine während der Bereichsüberprüfung effizientes Readahead ausführt. Daher wirkt sich # 1 auf die Leistung des Entfernungsscans aus, nicht auf die Leistung der Singleton-Suche.

2 misst, wie viel Platz auf jeder Seite auf Blattebene eines Index verschwendet wird. Verschwendeter Speicherplatz bedeutet, dass Sie mehr Seiten zum Speichern der Datensätze verwenden. Dies bedeutet mehr Speicherplatz zum Speichern des Index, mehr E / A zum Lesen des Index und mehr Speicher zum Speichern der Seiten im Pufferpool.

Schwellenwerte? Meine allgemeine Faustregel lautet weniger als 10% Fragmentierung, nichts tun. 10-30%, mache einen ALTER INDEX ... REORGANIZE (2005) / DBCC INDEXDEFRAG (2000). Machen Sie mehr als 30% einen ALTER INDEX ... REBUILD (2005) / DBCC DBREINDEX (2000). Dies sind vollständige Verallgemeinerungen, und die Schwellenwerte für Sie variieren.

Um Ihre Schwellenwerte zu ermitteln, verfolgen Sie die Workload-Leistung anhand der Fragmentierungsstufen und entscheiden Sie, wann die Leistungsverschlechterung zu groß ist. An diesem Punkt müssen Sie die Fragmentierung adressieren. Es gibt einen Spagat zwischen dem Leben mit Fragmentierung und dem Ressourcen-Hit, sie zu entfernen.

Ich habe hier nicht auf die Kompromisse zwischen den beiden Methoden zum Entfernen der Fragmentierung eingegangen, z. B. FILLFACTOR / PADINDEX, um die Fragmentierung zu verringern und weniger Defragmentierung vorzunehmen, Änderungen an Schema- / Zugriffsmustern, um die Fragmentierung zu verringern, oder verschiedene Arten von Wartungsplänen .

Übrigens empfehle ich immer, sich nicht um die Fragmentierung von Indizes mit weniger als 1000 Seiten zu kümmern. Dies liegt daran, dass der Index wahrscheinlich hauptsächlich im Speicher gespeichert ist (und dass die Leute nach einer Nummer gefragt haben und ich mir eine einfallen lassen musste).

Weitere Informationen hierzu finden Sie in meinem Artikel im TechNet Magazine zur Datenbankwartung unter http://technet.microsoft.com/en-us/magazine/cc671165.aspx im 2000-basierten Whitepaper zu Best Practices für die Indexdefragmentierung, bei denen ich mitgeschrieben habe http://technet.microsoft.com/en-us/library/cc966523.aspx und in meinem Blog unter der Kategorie Fragmentierung unter http://www.sqlskills.com/BLOGS/PAUL/category/Fragmentation.aspx .

Ich habe das irgendwie übertrieben beantwortet, aber es ist einer meiner Hot-Buttons. Hoffe das hilft :-)

Paul Randal
quelle