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 der Tisch 50% Fragmentierung, also noch mehr! Ich verstehe wirklich nicht, wie das passieren kann ...
sql-server
fragmentation
heap
Smoking
quelle
quelle
Antworten:
Was bedeutet Fragmentierung in einem Haufen?
Der Fragmentierungswert in Heap, den Sie
avg_fragmentation_in_percent
durch Abfragen vonsys.dm_db_index_physical_stats
DMV aus der Spalte erhalten, gibt dies anWeiter sagt das gleiche BOL das
Sie sehen also, dass nicht der freie Speicherplatz auf den Heap zugewiesenen Seiten, sondern die unterschiedliche Reihenfolge der Seiten die Fragmentierung verursacht.
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.
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
Sie können sehen, dass der
avg_fragmentation_in_percent
Spaltenwert 33% beträgt. Nun wollen wir sehen, wie die Seiten angeordnet sind. Dies kann mithilfe einer undokumentierten Abfrage erfolgen%%lockres%%
. Die Abfrage wäreUnd 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.
Es heißt, die erste Seite hat eine ID,
197
die nächste Seite hat eine ID. Die242
nachfolgenden Seiten haben eine fortlaufende ID, bis wir die Seiten-ID erreichen,264
da wir danach die Seiten-ID erhalten280
. Dieser Sprung in den 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
Sie können sehen, Fragmentierung ist jetzt
14%
.Lassen Sie uns die zugewiesenen Seitenzahlen sehen
Wir haben nur eine Sprungauflage. 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
Warum die Fragmentierung zunahm
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.
Am Hinterkopf sollten Sie auch bedenken, dass das Wort 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 hat dies in seiner Mythos-Sektion über Haufen behandelt .
PS: Bitte verwenden Sie keinen undokumentierten Befehl auf dem Produktionssystem. Dies war nur zur Demonstration.
quelle
Heaptest
und das Ergebnis suchen und angeben . Ich bin sicher, Sie haben vielleicht etwas verpasst. Stellen Sie einfach sicher, dass die Kompatibilitätsstufe nicht 80 ist. In diesem Fall funktioniert die Funktion db_id nicht