Hat die Defragmentierung von SQL-Indizes in einer SAN-Umgebung einen Vorteil?

16

Unser SQL Server befindet sich in einem SAN. Es enthält Dutzende von OLTP-Datenbanken, einige mit mehreren Tabellen, die mehr als 1 Million Datensätze enthalten.

Wir haben wöchentlich Ola Hallengrens Indexpflegeskripte ausgeführt, die jeweils mehrere Stunden lang ausgeführt werden. Basierend auf dem Fragmentierungsschwellenwert organisiert das Skript einen Index neu oder indiziert ihn neu. Wir haben festgestellt, dass während der Neuindizierung die Protokolldateien sehr groß werden, was zu einem übermäßigen Bandbreitenverbrauch während des Protokollversands führt.

Dann kommt ein Artikel von Brent Ozar, in dem er sagt, er solle sich keine Gedanken mehr über SQL-Indizes machen :

Ihre Festplatten werden mit anderen Servern gemeinsam genutzt, die gleichzeitig Laufwerksanforderungen stellen, sodass die Laufwerke immer überall herumspringen, um Daten abzurufen. Das Defragmentieren Ihrer Indizes ist nur eine bedeutungslose Arbeit.

Das googeln mit dieser Frage führt zu unterschiedlichen Meinungen, die meist von zu kurzen oder zu schwachen Argumenten gestützt werden. Unser vorläufiger Plan ist es, den Fragmentierungsschwellenwert in unserem Wartungsskript so anzupassen, dass es viel häufiger reorganisiert als neu indiziert wird.

Was ist das endgültige Urteil? Lohnt es sich, SQL-Indizes in einem SAN zu defragmentieren, um die Belastungen zu berücksichtigen, die mit der Ausführung wöchentlicher Wartungsaufträge verbunden sind?

dev_etter
quelle

Antworten:

10

Defragmentierungsstrategien tragen zur Verbesserung der Scan- Geschwindigkeit von / zur Festplatte bei .

Die Vielzahl der Meinungen beruht darauf, dass die ideale Defragmentierungsstrategie einer Umgebung von vielen verschiedenen Faktoren abhängen sollte. Es gibt auch mehrere potenzielle Fragmentierungsebenen im Spiel.

Zu sagen, dass Ihre Datenbanken in einem SAN gespeichert sind, reicht nicht aus. Beispielsweise:

  • Werden Datenbankdateien in separaten physischen RAID-Gruppen oder in derselben RAID-Gruppe gespeichert? Welche anderen Prozesse sind auf demselben Gerät aktiv? Kommen Ihre Backup-Dateien auch dort an? Möglicherweise müssen Sie Ihren SAN-Administrator nach diesen Informationen fragen, da diese nicht immer transparent sind.

  • Wie lauten die Zugriffsmuster für die Datenbanken? OLTP ist im Allgemeinen ein wahlfreier Zugriff, aber manchmal ist eine Anwendung tabellensuchbereit und Sie können ihr Verhalten nicht ändern (ISV-App). Sind die Anwendungen meistens lesbar, meistens schreibbar oder liegen sie irgendwo dazwischen?

  • Sind während einer Wiederherstellungs- / Failover-Phase SLAs für die Leistung aktiv ?

In Brents Post wird davon ausgegangen, dass es einen riesigen Speicherpool gibt, der von allen gemeinsam genutzt wird. Dies bedeutet, dass die physischen Datenträger selten inaktiv sind und der Zugriff daher meist zufällig erfolgt. Wenn das Ihre Situation ist, dann gilt der Rat, und ich stimme dem größtenteils zu. Diese Art von Strategie ist zwar viel einfacher zu verwalten, sie muss jedoch nicht (a) das sein, was Sie in Ihrer Umgebung haben, oder (b) die beste Lösung für Ihre Umgebung.

Wenn die Indexwartung lästig ist, sollten Sie sie weniger aggressiv ausführen und / oder die Kosten über die Woche amortisieren (dh einmal pro Tag eine leichte Wartung durchführen, statt einmal pro Woche eine schwere Wartung).

Sie können auch die SortInTempdbOption aktivieren, um möglicherweise den Umfang der Protokollierung in den Benutzerdatenbanken zu verringern.

Jon Seigel
quelle
Wow, gründliche Antwort. Es wird wahrscheinlich einige Zeit dauern, bis ich alle Nachforschungen angestellt habe, aber ich bezweifle nicht, dass Sie mich auf den richtigen Weg führen. Unsere derzeitige Strategie besteht darin, die Wartung sowohl vom Neuaufbau- als auch vom Neuaufbau-Standpunkt aus weniger aggressiv durchzuführen. Ich glaube, ich habe dies in der Frage falsch angegeben. Von dort aus werde ich den Rest der Faktoren, die Sie erwähnt haben, genauer untersuchen.
dev_etter
1
@dev_etter: Ich habe nur ein paar Faktoren aufgelistet; Es gibt viele mehr. Der Hauptpunkt ist der allererste Satz. Wenn Sie dies beim Durchdenken Ihrer Umgebung berücksichtigen, wird dies Ihre Entscheidung korrekt lenken. Daraus ergibt sich alles. (Dies alles setzt voraus, dass keine SSDs beteiligt sind.)
Jon Seigel
FWIW, ich hatte etwas völlig übersehen - das eigentliche Skript im Auftragsschritt (und nicht die Quelle) war so konfiguriert, dass es jeden Index mit einem minimalen Fragmentierungsprozentsatz von 1 adressiert bis 35. Der Job läuft jetzt in etwas mehr als 3 Stunden statt in 8 Stunden. Ihr Vorschlag, weniger aggressiv zu sein, war richtig. Mein Fehler lag in der Tatsache, dass ich dachte, der Job sei bereits weniger aggressiv ausgeführt worden. Dieser Ansatz ist wahrscheinlich am besten für uns, noch berühren und gehen, aber es hat bereits einige Schmerzen gelindert.
Dev_etter
@ JonSeigel Ich stimme dieser Antwort vollkommen zu. Auf meinen Reisen sehe ich, dass die meisten DBAs einen einzelnen Pool oder zumindest ein Array mit demselben RAID-Level gemeinsam nutzen. Ich hatte DBAs um 3 Uhr morgens rund um die Uhr, nur um einzelne Dateigruppen mit mehr als 100 TB Datenbanken zu defragmentieren ... und wofür genau? Wir hatten völlig zufällige IO auf den Festplatten und die Latenz betrug 15ms. Zu diesem Zeitpunkt sollte ich nur auf 15 ms zeigen und den Entwicklern sagen, dass sie mich in Ruhe lassen sollen.
Outwire
2

Im Idealfall sollten Sie NUR die Indizes reorganisieren / neu indizieren, die beachtet werden müssen, da Sie sonst Ressourcen verschwenden und möglicherweise andere Probleme verursachen.

Sie müssen eine Leistungsbasislinie erstellen und bei jeder Änderung die Leistungsänderung mit der Basislinie vergleichen, um festzustellen, ob Ihre Änderung eine Implementierung wert ist.

Jimbo
quelle
Unsere unmittelbare Strategie ist es, genau das zu tun - wir werden die Einstellungen für die Variablen minFragmentation und rebuildThreshold in diesem Skript optimieren
dev_etter
0

Okay, die Frage bezieht sich auf Datenbankindizes, die ein Konstrukt einer Datei oder einer Gruppe von Dateien sind. Das Lesen der obigen Antworten würde eine Person glauben lassen, dass es sich um eine Fragmentierung auf Datenträgerebene handelt und nicht um die Indizes in einer Datei. Diese völlig getrennten Themen.

Der kurzsichtige Ansatz hier ist, dass sich die Leistung beim Abrufen von Daten innerhalb der OLTP-Datenbank verbessert, wenn Indizes defragmentiert oder neu erstellt werden. Die Antwort ist ja! Es ist jedoch wichtig zu beachten, dass die Festplattenfragmentierung ebenfalls ein Faktor ist.

Niedrigste "Kosten" insgesamt? Führen Sie Ihre Datenbankwartung durch. Zweitniedrigste Kosten: Trennen Sie die Datenbank, verschieben Sie sie an einen anderen Ort, formatieren Sie die Datenträger neu und befolgen Sie die bewährten Methoden für die Ausrichtung der Datenträgerpartitionen ( http://msdn.microsoft.com/en-us/library/dd758814.aspx) . Verwenden Sie zu guter Letzt einen erweiterten Defragmentierer eines Drittanbieters wie Diskkeeper.

Beachten Sie, dass dies NUR für Speicher vom Typ NTFS (z. B. Windows-Betriebssystem) empfohlen wird und keine Empfehlung für ein Produkt darstellt. Ich bin auch nicht mit Condusiv Technologies oder seinen Tochterunternehmen verbunden.

IryDBA2791
quelle
2
Sie möchten wahrscheinlich vermeiden, kategorisch zu sagen "Die Antwort ist JA!" zu Problemräumen, die in anderen Plakaten ausführlich diskutiert wurden. Es mag zwar zutreffen, dass die Antwort manchmal "Ja" lautet, wie Brent Ozar in seinem Blogbeitrag gezeigt hat, aber das ist nicht immer der Fall.
Max Vernon