Hängt die Zeit für die Indexwiederherstellung von der Fragmentierungsstufe ab?


8

Ist die erforderliche Zeit für die Indexwiederherstellung vom Fragmentierungsgrad abhängig?

Dauert die Neuerstellung eines zu 80% fragmentierten Index ungefähr 2 Minuten, wenn die Neuerstellung des gleichen zu 40% fragmentierten Index 1 Minute dauert?

Ich frage nach der RUNTIME (zum Beispiel in Sekunden), die möglicherweise erforderlich ist, um die erforderliche Aktion auszuführen, und nicht nach der Aktion, die in welcher bestimmten Situation erforderlich ist. Mir sind grundlegende Best Practices bekannt, wenn Index-Reorg oder Aktualisierungen von Wiederherstellungen / Statistiken durchgeführt werden sollten.

Diese Frage bezieht sich NICHT auf REORG und den Unterschied zwischen REORG und REBUILD.

Hintergrund: Aufgrund der Einrichtung verschiedener Indexwartungsjobs (jede Nacht, schwerere Jobs an den Wochenenden ...) habe ich mich gefragt, ob ein täglicher "lichtintensiver" OFFLINE-Indexwartungsjob besser für niedrig-mittel fragmentierte Indizes ausgeführt werden sollte, um die zu erhalten Off-Times klein - oder spielt es keine Rolle, und die Neuerstellung auf einem zu 80% fragmentierten Index kann dieselbe Off-Time in Anspruch nehmen wie dieselbe Operation auf demselben zu 40% fragmentierten Index.

Ich folgte den Vorschlägen und versuchte selbst herauszufinden, was los ist. Mein Versuchsaufbau: Auf einem Testserver, der NICHTS anderes tut und von niemandem oder irgendetwas anderem verwendet wird, habe ich eine Tabelle mit einem Clustered-Index für eine Primärschlüsselspalte mit eindeutiger Kennung mit einigen zusätzlichen Spalten und verschiedenen Datentypen erstellt [2 Zahlen, 9 Datum / Uhrzeit und 2 varchar (1000)] und einfach Zeilen hinzugefügt. Für den vorgestellten Test habe ich ungefähr 305.000 Zeilen hinzugefügt.

Dann habe ich einen Aktualisierungsbefehl verwendet und zufällig einen Bereich von Zeilen aktualisiert, die nach einem ganzzahligen Wert filtern, und eine der VarChar-Spalten mit einem sich ändernden Zeichenfolgenwert geändert, um eine Fragmentierung zu erstellen. Danach habe ich das aktuelle avg_fragmentation_in_percentLevel eingecheckt sys.dm_db_index_physical_stats. Immer wenn ich eine "neue" Fragmentierung für meinen Benchmark erstellt habe, habe ich diesen Wert einschließlich des physical_page_countWerts zu meinen Aufzeichnungen hinzugefügt, aus denen das folgende Diagramm besteht.

Dann lief ich: Alter index ... Rebuild with (online=on); und griff nach dem, CPU timeindem STATISTICS TIME ONich es in meine Aufnahmen verwendete.

Meine Erwartungen: Ich hatte erwartet, zumindest einen Hinweis auf eine Art lineare Kurve zu sehen, die eine Abhängigkeit zwischen Fragmentierungsgrad und CPU-Zeit zeigt.

Das ist nicht der Fall. Ich bin mir nicht sicher, ob dieses Verfahren wirklich für ein gutes Ergebnis geeignet ist. Vielleicht ist die Anzahl der Zeilen / Seiten zu gering?

Die Ergebnisse zeigen jedoch, dass die Antwort auf meine ursprüngliche Frage definitiv NEIN wäre . Es sieht so aus, als ob die erforderliche CPU-Zeit, die SQL Server zum Wiederherstellen des Index benötigt, weder von der Fragmentierungsstufe noch von der Seitenzahl des zugrunde liegenden Index abhängt.

Das erste Diagramm zeigt die CPU-Zeit, die erforderlich ist, um den Index im Vergleich zur vorherigen Fragmentierungsstufe neu aufzubauen. Wie Sie sehen können, ist die durchschnittliche Linie relativ konstant und es ist überhaupt kein Zusammenhang zwischen Fragmentierung und erforderlicher CPU-Zeit zu beobachten.

Um den möglichen Einfluss der sich ändernden Anzahl von Seiten im Index nach meinen Aktualisierungen zu berücksichtigen, deren Wiederherstellung mehr oder weniger Zeit in Anspruch nehmen könnte, habe ich FRAGMENTATION LEVEL * PAGES COUNT berechnet und diesen Wert in der zweiten Tabelle verwendet, die das Verhältnis der erforderlichen CPU-Zeit zeigt Fragmentierung und Seitenzahl.

Indexfragmentierung und Neuerstellung der CPU-Zeitstatistik

Wie Sie sehen, bedeutet dies auch nicht, dass die zum Wiederherstellen erforderliche Zeit von der Fragmentierung beeinflusst wird, selbst wenn die Anzahl der Seiten variiert.

Nachdem ich diese Aussagen gemacht habe, denke ich, dass mein Verfahren falsch sein muss, da die CPU-Zeit, die zum Wiederherstellen eines riesigen und stark fragmentierten Index erforderlich ist, möglicherweise nur von der Anzahl der Zeilen beeinflusst wird - und ich glaube nicht wirklich an diese Theorie.

Da ich dies jetzt wirklich und definitiv herausfinden möchte, sind weitere Kommentare und Empfehlungen sehr willkommen .

Antworten:


2

Hängt die erforderliche Zeit für die Indexwiederherstellung vom Fragmentierungsgrad ab?

Ich glaube, dies wird nicht der Hauptparameter sein, über den SQL Server entscheiden wird, und es braucht Zeit, um den Index neu zu erstellen und neu zu organisieren:

Basierend auf "DATA" gibt es verschiedene andere Faktoren, über die entschieden wird, wie lange es dauern wird: Parameter wie

Faktor 1: Tabellengröße

Faktor 2: Bedenken hinsichtlich der Verfügbarkeit

Faktor 3: Partitionierung

Faktor 4: Indexspalten und Eindeutigkeit

Wenn Sie mehr über diese Faktoren erfahren möchten, können Sie hier darauf verweisen .

Die Wiederherstellung eines zu 80% fragmentierten Index dauert ungefähr 2 Minuten, wenn die Wiederherstellung desselben zu 40% fragmentierten Index 1 Minute dauert

Wieder kann die Antwort sein, es kommt darauf an! Für die Zahlen müssen Sie das Szenario testen und die Ausgaben sehen, wie es geht. Verfolgen Sie Details wie für FRAG Level 80, der Wiederaufbau dauerte X Stunden \ Minuten \ Sekunden und für Frag Level 40 dauerte der Wiederaufbau Y Stunden \ Minuten \ Sekunden. Berechnen und speichern Sie den Verlauf beispielsweise über 15 Tage (abhängig von der geplanten Wartungsaktivität), und Sie können zu dem Schluss kommen, wie viel Zeit der tatsächliche Vergleich der beiden benötigt.

Zusätzlich :

Sie können die Daten \ Berechnung über den Fortschritt der Indexwiederherstellung erfassen:

entweder mit DMV sys.dm_exec_requests ODER

Wenn Sie über Olas Wartungspläne für die Neuindizierung und Neuorganisation verfügen, können Sie den Verlauf der während der Wartung ausgeführten Aktionen in der Tabelle CommandLog speichern, wie unter SQL Server-Index- und Statistikverwaltung erläutert . Sobald die Daten gespeichert sind, können Sie den Befehlstyp "ALTER_INDEX - REBUILD" und die Differenz zwischen den Spalten START TIME und END TIME abfragen


@KASQLDBA Ich ging in die Statistik / das Protokoll von Olas CommandLog-Tabelle. Die Dauer ist sehr sehr zufällig und es ist keine Beziehung zum Fragmentierungsgrad erkennbar. Da ich diese Werte nur in einer Produktionsumgebung habe, kann die erforderliche Zeit für die Wiederherstellung stark von anderen Prozessen beeinflusst werden, sodass dies keine allgemeine Antwort zu liefern scheint.
Magier

8

Für alle Interessierten habe ich ein Diagramm erstellt, das die Dauer der Indexwiederherstellung von etwa 2500 Indexwiederherstellungen innerhalb weniger Wochen in Bezug auf die Fragmentierung des Index und seine Größe in Seiten zeigt.

Diese Daten basieren auf 10 SQL Servern, Hunderten von Tabellen und den Optimierungsverfahren von Ola Hallengren . Der allgemeine Schwellenwert für die Wiederherstellung wird auf 5% Fragmentierung festgelegt.

Ich habe einige der größten Tabellen (10 Mi + Seiten) in dieser Statistik abgeschnitten, um sie besser lesbar zu machen.

Das Diagramm zeigt die erforderliche Zeit (Dauer) als Größe der Blasen. Die Werte der größten Blase liegen bei 220 Sekunden. Es zeigt, dass die zum Wiederherstellen eines Index erforderliche Zeit nicht wirklich mit der Fragmentierung zusammenhängt. Stattdessen scheint es mehr von der Anzahl der Seiten des Index abzuhängen. Es zeigt auch an, dass eine Fragmentierung auf niedriger Ebene zeitaufwändiger ist als eine Fragmentierung auf höherer Ebene. Dauer der Indexwiederherstellung

Das zweite Diagramm wird nur in den Bereich <= 200 K Seiten gezoomt. Es zeigt dasselbe, es dauert länger für größere Indizes, nicht für mehr Fragmentierung. Geben Sie hier die Bildbeschreibung ein


6

REBUILDDer Index hängt nicht von der Fragmentierung ab. Der Index wird vollständig gelöscht und von Grund auf neu erstellt.

REORGANZE index - dient zum Reduzieren der Fragmentierung ohne Indexwiederherstellung, also kein Löschen und Erstellen.

MS empfiehlt die Verwendung von Reorganize für eine Fragmentierung von 30% oder weniger. Für eine höhere Fragmentierung wird Rebuild bevorzugt.

Hier ist ein MSDN-Artikel dazu: Reorganisieren und Neuerstellen von Indizes

AKTUALISIEREN

In Bezug auf die Zeit, die benötigt wird, um den Vorgang abzuschließen, hängt dies offensichtlich von der Indexfragmentierung ab. Die Neuerstellung eines stark fragmentierten Index dauert weniger lange als die Reorganisation. Das Wiederherstellen eines leicht fragmentierten Index dauert viel länger. Ich würde vorschlagen, MS-Richtlinien als Ausgangspunkt zu nehmen und einige Tests an Ihren Tabellen durchzuführen. Der Breakeven-Punkt in Bezug auf die Fragmentierung in% hängt von der spezifischen Tabelle, der Indexgröße und dem Datentyp ab.


4

Dauert die Neuerstellung eines zu 80% fragmentierten Index ungefähr 2 Minuten, wenn die Neuerstellung des gleichen zu 40% fragmentierten Index 1 Minute dauert?

Der Algorithmus für REBUILD vs REORG ist unterschiedlich. Ein REORG weist im Gegensatz zu einem REBUILD KEINE neuen Extents zu. Ein REORG arbeitet mit aktuell zugewiesenen Seiten (weist eine 8-KB-Zufallsseite zu, damit die Seiten verschoben werden können), verschiebt sie und gibt die Seiten bei Bedarf frei.

Aus meinen SQLSkills-Interna (ehemals IE0) Notizen ....

Für REBUILD:

  • Es kann mehrere CPUs verwenden - kann die Parallelität nutzen, um die Arbeit schnell zu erledigen.
  • Bei stark fragmentierten Indizes (z. B. 80% wie in Ihrem Beispiel) ist ein REBUILD viel schneller als ein REORG. REBUILD erstellt nur eine weitere Kopie des Index, während REORG beim Entfernen der Fragmentierung ins Stocken gerät und daher langsamer ist. Dies ist der Grund, warum Paul Randal seine allgemeine Empfehlung gab, dass es gut sein wird, einen REBUILD eines stark fragmentierten Index durchzuführen.
  • Mit einem REBUILD können Sie den Wiederherstellungsmodus auf BULK_LOGGED ändern, um dort eine minimale Protokollierung zu erzielen, indem Sie weniger Protokolldatensätze generieren .

Für Index REORG:

  • Es ist immer Single-Threaded. Keine Parallelität.
  • Es ist langsamer für stark fragmentierte Indizes und schneller für leicht fragmentierte Indizes. Die Kosten für die Erstellung eines Index im Vergleich zu einer Neuordnung eines leicht fragmentierten Index sind höher, und daher ist ein REORG für einen leicht fragmentierten Index schneller.
  • Ein REORG ist immer ein vollständig protokollierter Vorgang.

Lesen Sie weiter - Hinweise - Fragmentierung, Typen und Lösungen des SQL Server-Index


Kin, TY für Ihren Kommentar, aber ich glaube, Sie haben den Kern meiner Frage überwacht. Sie vergleichen Reorg mit Rebuild. Ich fragte nach einem Vergleich von Rebuild mit Rebuild für verschiedene Fragmentierungsstufen (ceteris paribus).
Magier

@Magier Wenn Sie meine Antwort sorgfältig erneut lesen, wird Ihre Kernfrage beantwortet. Wenn ein Index stark fragmentiert ist, erstellen Sie ihn neu. Die Kosten für den Wiederaufbau eines leicht fragmentierten Unternehmens sind weitaus höher als für einen Umbau. Es gibt auch keine richtige oder falsche Methode, um die Fragmentierung durch eine Neuerstellung oder Neuorganisation zu beheben. Dies hängt alles von der Systemverfügbarkeit, den Daten, der Indexgröße, dem Festplatten-E / A-Subsystem usw. ab. Außerdem können Sie einige Tests gemäß Ihrer Umgebung problemlos starten Vergleichen von Wiederherstellen mit Wiederherstellen für verschiedene Fragmentierungsstufen. Kannst du nicht?
Kin Shah

Ich habe nie nach REORG gefragt oder erwähnt. Es geht nur um REBUILD. Und ja, sicher, ich könnte Tests einrichten und versuchen, bestimmte Fragmentierungsstufen zu erstellen, um herauszufinden, wie lange die Wiederherstellung dauern wird, aber ich wollte sehen, ob jemand dies bereits weiß und mir nur die erwarteten Ergebnisse dieses Ansatzes mitteilen kann.
Magier


0

Ja, da bei einer Neuerstellung normalerweise der ursprüngliche Index der Reihe nach gescannt werden muss, während die Zeilen (der Reihe nach) in eine neue physische Indexpartition gestreamt werden. Fragmentierung schadet nicht zwischengespeicherten Scans, also wird der Wiederaufbau ja länger dauern.

Wie lange es noch dauert, hängt von der Fragmentierung und der CPU-Bindung des gesamten Prozesses ab. Das Serialisieren von Zeilen ist sehr CPU-intensiv, sodass es möglicherweise überhaupt keine Rolle spielt. Oder Sie erhalten zufällige E / A-Raten von normalerweise 1,5 MB / s, was leicht 5-10x langsamer ist als eine schnelle Neuerstellung (abhängig von Schema und Daten). Abhängig von den Annahmen, die Sie treffen, können Sie wahrscheinlich alles zwischen 1x und 100x Verlangsamung erfinden.

Dauert die Neuerstellung eines zu 80% fragmentierten Index ungefähr 2 Minuten, wenn die Neuerstellung des gleichen zu 40% fragmentierten Index 1 Minute dauert?

Es ist keine lineare Beziehung. Die Fragmentierungsmetrik ist ein sehr grober Indikator für die Zeit, die zum Scannen einer Partition benötigt wird.


@Magier gute Forschung. Die CPU-Zeit wird niemals durch Fragmentierung beeinflusst. Sie testen winzige Tabellen, die vollständig im Speicher zwischengespeichert sind, sodass überhaupt keine Lese-E / A vorhanden sind. Der Test ist ungültig. Testen Sie mit größeren Tabellen (wie 100 MB) und führen Sie dies CHECKPOINT; DBCC DROPCLEANBUFFERSvor jedem Test durch. Ich bin auch daran interessiert, die Ergebnisse zu sehen. Ich habe einmal einen ähnlichen Test durchgeführt, bei dem ich die Scan-Geschwindigkeit in Abhängigkeit von der Fragmentierung gemessen habe, aber ich erinnere mich nicht an das Ergebnis.
usr

Beachten Sie auch, dass die Fragmentierungsnummer eine Art loser Indikator ist, denn was wirklich zählt, ist die Bewegung des physischen Plattenkopfs. Ich kann mir viele E / A-Muster vorstellen, die relativ schnell sind, aber eine 100% ige Fragmentierung aufweisen, gemessen von SQL Server anhand seiner engen Definition. Zum Beispiel sollte das Zuordnungsmuster 1_2_3_4, bei dem 1-4 gescannt wird und _ ein Loch ist, schnell sein.
usr

Welchen Wert muss ich dann genau betrachten? Ich erhalte tatsächlich die folgenden Informationen von Rebuild: CPU-Zeit = 0 ms, verstrichene Zeit = 70 ms. Tabelle 'tFrag2'. Scananzahl 4, logische Lesevorgänge 512067, physische Lesevorgänge 26, Vorlesevorgänge 71209, logische Vorlesevorgänge 0, physische Vorlesevorgänge 0, Vorlesevorgänge 0. SQL Server-Ausführungszeiten: CPU-Zeit = 8657 ms, verstrichene Zeit = 27246 Frau. SQL Server-Ausführungszeiten: CPU-Zeit = 8657 ms, verstrichene Zeit = 27386 ms.
Magier

Sind diese Zeiten aus 3 Abfragen? Es ist ein bisschen verwirrend. An den ersten Zahlen können Sie erkennen, dass viele Daten zwischengespeichert sind. Auch 70ms ist zu kurz für einen gültigen Benchmark. Können Sie klarstellen, was diese Zahlen darstellen?
usr

Die Zeiten, die ich erwähnte, stammten von STATISTICS_TIME und STATISTICS_IO. Ich werde jetzt einen neuen Benchmark neu starten und dieses Mal möchte ich die richtigen Ergebnisse erzielen. Weitere Vorschläge sind daher sehr willkommen. Ich verstehe nicht, was das Bereinigen des Datencaches hilft, da ich daran interessiert bin, die Daten schnell zurückzubekommen, aber den Index neu zu erstellen. Was muss afaik überhaupt auf der Festplatte getan werden?
Magier
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.