Wie lege ich SQL Server-Indexseiten pro Fragment fest?

7

Ich habe SQL Server 2008 und eine Reihe von Datenbanken. Ich habe festgestellt, dass einer der Indizes meiner Tabelle extrem fragmentiert ist (wie ich weiß: http://msdn.microsoft.com/en-us/library/ms189858.aspx )

Das avg_fragmentation_in_percentsind satte 97% oder mehr und die Fragmentzahl liegt bei Tausenden. Sehr interessanterweise ist das avg_fragment_size_in_pagesnur etwas mehr als 1. Ich kann es defragmentieren, was hilft, aber ich möchte verhindern, dass dies überhaupt passiert.

Warum sind die Seiten pro Fragment so niedrig? Ich habe FILEGROWTH = 128MBfür die Datenbank als Ganzes, aber diese bestimmte Tabelle ist die aktivste. Gibt es eine Möglichkeit, SQL Server anzuweisen, dieser Tabelle oder diesem Index mehr Wachstum zuzuweisen, damit die Seiten pro Fragment höher sind?

Sugrue
quelle
Ich sollte auch beachten, dass diese fragmentierte Tabelle viele Einfügungen erhält, aber sehr selten gelöscht wird.
2
Was verwenden Sie für einen Clusterschlüssel für die Tabelle? Ist es ein monoton ansteigender Wert (wie eine INDENTITY) oder ist es zufällig (z. B. GUID oder Zeichenkette). In letzterem Fall erhalten Sie möglicherweise Seitenaufteilungen, da Daten in eine vorhandene Seite eingefügt werden müssen.
Stuart Moore
2
Was ist der Füllfaktor? Wie groß ist dieser Tisch? Und Zeilengröße?
Gbn
Stuart - Das könnte es sein. Ich habe 3 Indizes für diese Tabelle. Index IX ist grundsätzlich sequentiell und 5% fragmentiert, 6 Seiten pro Fragment. Der Index PK ist in zeitlicher Reihenfolge und zu 85% fragmentiert. Der Index SX ist räumlich und zu 97% fragmentiert. Sowohl PK als auch SX haben 1 Seite pro Fragment. gbn - Ich scheine den Füllfaktor nicht einzustellen; Was ist Standard? Und was wäre der beste Wert dafür?
Sugrue
2
Sie sollten die Grundursache der Fragmentierung beheben - nicht nur einen Patch darauf anwenden ... warum ist die Tabelle so fragmentiert? Was ist Ihr Clustering-Schlüssel (welche Spalten, welche Datentypen)? Repariere das zuerst!
Marc_s

Antworten:

15

In erster Linie sollten Sie die Auswirkungen der Fragmentierung bewerten . Viel zu oft wird Fragmentierung als die ultimative böse Ursache aller Serverprobleme ohne Berücksichtigung ihrer tatsächlichen Auswirkungen dargestellt. Die Fragmentierung wirkt sich auf verschiedene Aspekte aus:

  • Verlangsamen Sie die Scans aufgrund der Auswirkungen auf die Vorausleseeffizienz und der geringen E / A-Größe (Seite vs. Umfang).
  • Weniger effiziente E / A aufgrund geringer Zeilen pro Seite aufgrund häufiger Teilungen
  • Niedrigere Pufferpool-Cache-Trefferquote (dh niedrigere Seitenlebensdauer) aufgrund derselben wie oben
  • Höhere Kostenauswirkungen von INSERTs aufgrund häufiger Teilungen

Alle oben genannten sind schlecht, aber hier ist der eigentliche Deal: Sie können 97% Fragmentierung haben, ohne dass eines der oben genannten Symptome vorliegt . Eine hohe Fragmentierung kann in der Tat all diese Probleme verursachen, jedoch nur, wenn Ihre spezifische Arbeitslast tatsächlich so mit der Fragmentierung interagiert, dass diese Symptome auftreten.

Ich würde empfehlen, die Waits and Queues- Methode zu verwenden, um Ihre tatsächlichen Leistungsengpässe zu lokalisieren und sie entsprechend zu bewerten. Sie können sehr gut bestätigen, dass die Fragmentierung schwerwiegende Auswirkungen hat und dass Schema- und möglicherweise Anwendungsänderungen erforderlich sind, um das Problem zu beheben. Möglicherweise stellen Sie jedoch fest, dass das Problem an einer anderen Stelle liegt und die Lösung völlig anders ist.

Und zum Schluss: Vielleicht stellen Sie auch fest, dass 5.000 US-Dollar für mehr RAM und ein paar gute SSDs die Probleme, die Sie haben, vollständig lindern. Bevor Sie vor Entsetzen über ein solches Mittel mit den Schultern zucken (was, keine Grundursache wird angesprochen? Anathema!), Berücksichtigen Sie das Risiko und die Kosten, die mit einer Anwendungsänderung verbunden sind ...

Remus Rusanu
quelle
Dank Remus habe ich messbare Probleme mit der Verlangsamung dieses Index (Timeouts haben meine Aufmerksamkeit darauf gelenkt). Der Kauf von mehr RAM ist in diesem Fall keine Option, da die Datenbank von Kunden auf ihren Computern erstellt und verwendet wird.
Sugrue
1
Client-Zeitüberschreitungen, wie die .Net SqlCommand-Standardzeitüberschreitungen von 30 Sekunden?
Remus Rusanu
Ja, "System.Data.SqlClient.SqlException (0x80131904): Zeitüberschreitung abgelaufen. Die Zeitüberschreitung, die vor Abschluss des Vorgangs verstrichen ist oder der Server nicht reagiert." Es kommt selten vor, aber viel häufiger, wenn die Fragmentierung hoch ist. Die Suche ist auch viel, viel langsamer.
Sugrue
3
Fragmentierung verursacht das auf keinen Fall . 30 Sekunden würden von Dingen wie Dateiwachstum oder Sperrkonflikten (wahrscheinlich verursacht durch Scans) kommen. Ich würde mich darauf konzentrieren zu verstehen, was passiert, wenn diese Zeitüberschreitungen auftreten.
Remus Rusanu
4
Jede Antwort, die ich wagen würde, wäre Spekulation. Versuchen Sie Wartezeiten und Warteschlangen. Sammle Leistungsindikatoren. Messen.
Remus Rusanu