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 .
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.
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.
quelle
REBUILD
Der 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.
quelle
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:
Für Index REORG:
Lesen Sie weiter - Hinweise - Fragmentierung, Typen und Lösungen des SQL Server-Index
quelle
Ich weiß, dass es ein alter Thread ist, aber ich denke, es wird von Vorteil sein, Paul Randals Beitrag hier zu teilen.
https://www.sqlskills.com/blogs/paul/sqlskills-sql101-rebuild-vs-reorganize/
quelle
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.
Es ist keine lineare Beziehung. Die Fragmentierungsmetrik ist ein sehr grober Indikator für die Zeit, die zum Scannen einer Partition benötigt wird.
quelle
CHECKPOINT; DBCC DROPCLEANBUFFERS
vor 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.