Wie reduziert SQL Server die Indexfragmentierung?

7

Wenn ein Benutzer niemals ausgeführt wird REBUILDoder sich REORGANIZEin seiner Datenbank befindet, defragmentiert SQL Server die Indizes trotzdem irgendwie?

MSDN schlägt vor, dass ein Index, der zu mehr als 30% fragmentiert ist, REBUILDstattdessen ausgeführt wird REORGANIZE. Würde das REORGANIZEmehrfache Laufen das Gleiche bewirken wie REBUILD?

Ich wundere mich darüber, weil ich einen Client habe, der einen stark fragmentierten Index hat. Sie laufen REORGANIZEjedes Wochenende gegen diesen Index und im Laufe der Zeit scheint es, als würde ihr Index defragmentiert.

Macht das Sinn?

dsum
quelle

Antworten:

11

Nein, es gibt keine automatische magische Defragmentierung von Indizes. Wenn Sie fragmentiert sind, müssen Sie REBUILDoder REORGANIZE.

Durch die Reorganisation eines Index wird die Blattebene eines Index defragmentiert, indem die Seiten physisch neu angeordnet werden, damit sie der logischen Reihenfolge entsprechen. Die Sperrdauer ist kurz und führt zu einer minimalen Blockierung von Abfragen.

Beim erneuten Erstellen wird ein Index gelöscht und ein neuer erstellt. Mit der Enterprise Edition kann dies als Online-Vorgang ausgeführt werden, wenn der Index keine LOB-Typen enthält. Bei der Standard Edition oder wenn LOB-Typen vorhanden sind, wird dies blockiert. Siehe Wie Online - Indexvorgänge Arbeit für eine Erläuterung, wie Rebuilds Online gleichzeitig mit Benutzeroperationen auftreten kann.

Die Empfehlung "Reorganisieren vs. Wiederaufbau" ist ungefähr der Schwellenwert, ab dem der Arbeitsaufwand für die Defragmentierung durch Reorganisation mit einem Wiederaufbau vergleichbar ist, dh bei einer Fragmentierung von> 30% sind mehr Ressourcen und mehr Zeit erforderlich, um einen Umbau abzuschließen als ein Wiederaufbau.

Mehrere Reorganisationsläufe würden den Index nicht weiter defragmentieren.

Mark Storey-Smith
quelle
6

Wenn der Benutzer REBUILD oder REORGANIZE niemals in der Datenbank ausführen würde, würde die SqlServer-Engine die Indizes defragmentieren?

Nein.

Würde das mehrfache Ausführen von REORGANIZE die gleichen Aktionen wie REBUILD ausführen

Auch Nein.

A REORGANIZEordnet die Blattseiten (die Seiten, die die tatsächlichen Indexdaten enthalten) so an, dass sie in der richtigen Reihenfolge gemäß den Indexspezifikationen vorliegen. Seiten können auch konsolidiert und leere Seiten gelöscht werden, es werden jedoch keine neuen Seiten zugewiesen und die btree-Struktur und -Statistiken werden nicht neu erstellt.

A REBUILDlässt den alten Index fallen und macht ihn von Grund auf neu. Dadurch werden alle B-Tree-Strukturen aktualisiert, nicht benötigter Leerraum entfernt und die Fragmentierung auf 0 gesetzt (oder so nahe an 0, wie es die Kontinuität der freien Seiten in der Datenbank zulässt).

JNK
quelle
5

Kein SQL Server führt keine automatische Wartung durch.

Das REORGANIZEmehrmalige Ausführen hat nach dem ersten erfolgreichen Ausführen keine Auswirkung (das Ignorieren von Seiten, die seit der Reorganisation geändert wurden, oder von Seiten, die nicht gesperrt und beim ersten Versuch übersprungen werden konnten).

Es werden Seiten außerhalb der Reihenfolge in die richtige Reihenfolge verschoben. Sobald dies geschehen ist und alle in der richtigen Reihenfolge sind, haben zusätzliche Läufe keine Auswirkung mehr. Fragmentierung, die aufgrund nicht zusammenhängender Zuordnungen entsteht, kann nicht entfernt werden. Dafür müssen Sie neu erstellen.

Martin Smith
quelle
4

Ich möchte nur einige Punkte zu den vorhandenen Antworten hinzufügen:

Gonsalu
quelle