it-swarm.com.de

Wie kann die HEAP-Fragmentierung in SQL Server verringert werden?

ich habe kürzlich herausgefunden, dass eine Heap-Tabelle mehr als 70% fragmentiert ist. Also habe ich beschlossen, eine zu machen

ALTER TABLE dbo.myTable REBUILD

Komisch genug, danach hatte ich 20% Fragmentierung. Seitdem wurde nicht mehr auf diesen Tisch geschrieben. Also habe ich beschlossen, den Umbau noch einmal durchzuführen.

Nach dem 2. Mal hat die Tabelle 50% Fragmentierung, also sogar mehr! Ich verstehe wirklich nicht, wie das passieren kann ...

10
tuxmania

Was bedeutet Fragmentierung in einem Haufen

Der Fragmentierungswert in Heap, den Sie aus der Spalte avg_fragmentation_in_percent Durch Abfragen von sys.dm_db_index_physical_stats DMV erhalten, gibt dies an

Logische Fragmentierung für Indizes oder Extent-Fragmentierung für Heaps in der Zuordnungseinheit IN_ROW_DATA.

Weiter sagt das gleiche BOL das

Dies ist der Prozentsatz der nicht in der Reihenfolge liegenden Ausmaße auf den Blattseiten eines Haufens. Ein Bereich außerhalb der Reihenfolge ist ein Bereich, bei dem der Bereich, der die aktuelle Seite für einen Heap enthält, physisch nicht der nächste Bereich nach dem Bereich ist, der die vorherige Seite enthält.

Sie können also sehen, dass nicht der freie Speicherplatz auf den dem Heap zugewiesenen Seiten vorhanden ist, sondern die unterschiedliche Reihenfolge der Seiten , das die Fragmentierung erzeugt.

Dies kann durch einen kleinen Test nachgewiesen werden. Lassen Sie uns eine Heap-Tabelle erstellen, einige Datensätze einfügen und dann die Fragmentierung überprüfen.

create table dbo.HeapTest
(
Id INT not NULL Default (1),
Col1   char(5000) Not null Default ('Heaps Are Cool')
)

SET NOCOUNT ON

Insert into dbo.Heaptest default values
go 50

select index_type_desc,avg_fragmentation_in_percent,fragment_count,
avg_page_space_used_in_percent,record_count
from sys.dm_db_index_physical_stats(db_id(),object_id('dbo.HeapTest','U'),0,default,'detailed')

Die Heap-Tabelle wird also mit 50 Datensätzen erstellt. Nachfolgend sehen Sie, wie die Fragmentierung nach der Abfrage DMV sys.dm_db_index_physical stats aussieht

(enter image description here

Sie können sehen, dass der Spaltenwert avg_fragmentation_in_percent 33% beträgt. Nun wollen wir sehen, wie die Seiten angeordnet sind. Dies kann mithilfe der undokumentierten Abfrage %%lockres%% Durchgeführt werden. Die Abfrage wäre

SELECT  %%lockres%%, * FROM dbo.HeapTest;

Und unten sehen Sie, wie die Ausgabe aussieht. Nur relevanten Teil davon anhängen. Die Abfrage ergab 50 Zeilen, da wir 50 Zeilen in unsere Tabelle dbo.HeapTest eingefügt haben.

(enter image description here

Es heißt, die erste Seite hat die ID 197 Die nächste Seite hat die ID 242. Die nachfolgenden Seiten haben eine fortlaufende ID, bis wir die Seiten-ID 264 Erreichen, da wir danach die Seiten-ID 280. Dieser Sprung in Seiten-ID-Nummern verursacht also tatsächlich eine Fragmentierung.

Damit der Heap nicht neu erstellt und der Befehl erneut ausgeführt wird, um die Fragmentierung und die Anordnung der Seiten anzuzeigen. Wir bekommen Fragmentierung wie

(enter image description here

Sie können sehen, dass die Fragmentierung jetzt 14% Ist.

Lassen Sie uns die zugewiesenen Seitenzahlen sehen

(enter image description here

Wir haben nur eins Sprungruhe allen Seiten wird die Seiten-ID seriell zugewiesen. Da nur eine Sprungfragmentierung erheblich abnahm.

Ich habe den Heap wieder aufgebaut und jetzt, als ich die Fragmentierung überprüft habe, war er vollständig verschwunden. Und die Zuweisung der Seiten-ID ist wie

(enter image description here

Warum die Fragmentierung zunimmt

In Bezug auf das, was zu einem Anstieg der Fragmentierung hätte führen können, können wir bestätigen, dass Seiten, die dem Heap zugewiesen wurden, nicht kontinuierlich waren, wie Sie oben gesehen haben, was zu einem Anstieg des Fragmentierungswerts führte, war ein Sprung in die den Seiten zugewiesenen PAGE-IDs.

Im Hinterkopf sollten Sie auch berücksichtigen, dass die Word-Fragmentierung für HEAP keine Bedeutung hat. Wie würden Sie die Fragmentierung für eine Reihe nicht geordneter Seiten definieren?.

Wirklich besorgt über Fragmentierung

Wenn Sie wirklich mit einem Szenario konfrontiert sind, in dem die Heap-Tabelle fragmentiert ist und Abfragen verlangsamt, ist es besser, einen Clustered-Index für die Tabelle zu erstellen, als ihn neu zu erstellen. Der Grund dafür ist, dass beim Neuerstellen des Heaps alle zugrunde liegenden Nicht-Clustered-Indizes ebenfalls neu erstellt werden, was dazu führt, dass der Wiederherstellungsprozess viel länger dauert, viele Ressourcen verbraucht und das Transaktionsprotokoll aufgebläht wird. Auf einem Produktionssystem würde man immer versuchen, dies zu vermeiden. Paulus behandelte dies in seinem Mythos Abschnitt über Haufen .

PS: Bitte verwenden Sie keinen undokumentierten Befehl auf dem Produktionssystem. Dies war nur zur Demonstration.

17
Shanky