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_percent
Level 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_count
Werts 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 time
indem STATISTICS TIME ON
ich 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.
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 .