Co oznacza fragmentacja w kupie
Stwierdzono, że wartość fragmentacji w Sterty, którą otrzymujesz z kolumny avg_fragmentation_in_percent
poprzez zapytanie sys.dm_db_index_physical_stats
DMV
Fragmentacja logiczna dla indeksów lub fragmentacja zasięgu dla hałd w jednostce alokacji IN_ROW_DATA.
Dalej ten sam BOL tak mówi
Jest to procent zakresu poza kolejnością na stronach liści sterty. Zasięg poza kolejnością to taki, dla którego zasięg zawierający bieżącą stronę sterty nie jest fizycznie następnym zasięgiem po zakresie zawierającym poprzednią stronę.
Widzisz więc, że fragmentacja nie powoduje wolnego miejsca na stronach przypisanych do Sterty, ale zmienną sekwencję stron .
Można to wykazać za pomocą małego testu. Stwórzmy Stertę Stert i wstawmy do niej niektóre rekordy, a następnie sprawdź fragmentację.
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')
Tak więc tworzona jest tabela sterty z 50 rekordami. Poniżej wygląda fragmentacja po zapytaniu statystyki DMV sys.dm_db_index_physical
Można zobaczyć avg_fragmentation_in_percent
wartość kolumny wynosi 33%. Zobaczmy teraz, jak są ułożone strony. Można to zrobić za pomocą nieudokumentowanego zapytania %%lockres%%
. Zapytanie byłoby
SELECT %%lockres%%, * FROM dbo.HeapTest;
A poniżej wygląda wyjście. Dołączanie tylko odpowiedniej części. Kwerenda wygenerowała 50 wierszy, ponieważ wstawiliśmy 50 wierszy do naszej tabeli dbo.HeapTest.
Mówi się, że pierwsza strona ma identyfikator, 197
następna strona ma identyfikator, 242
kolejne strony mają ciągły identyfikator, dopóki nie osiągniemy identyfikatora strony, 264
ponieważ potem otrzymamy identyfikator strony 280
. Tak więc skok numerów identyfikacyjnych stron powoduje fragmentację.
Teraz nie odbuduj sterty i nie uruchom ponownie polecenia, aby zobaczyć fragmentację i sposób ułożenia stron. Otrzymujemy fragmentację jak
Widać, że fragmentacja jest teraz 14%
.
Zobaczmy przydzielone numery stron
Mamy tylko jeden skok, wszystkie strony mają przypisany identyfikator strony. Ponieważ tylko jedna fragmentacja skoku znacznie się zmniejszyła.
Ponownie odbudowuję Stertę i teraz, gdy sprawdziłem fragmentację, całkowicie zniknęła. Przydział identyfikatora strony jest podobny
Dlaczego zwiększona fragmentacja?
Teraz, jeśli chodzi o to, co mogło spowodować wzrost fragmentacji, możemy potwierdzić, że kiedy strony były przydzielane do stosu, nie byłyby one ciągłe, jak widać powyżej, co spowodowało wzrost wartości fragmentacji, to skok w przypisaniu stron ID PAGE.
Z tyłu głowy należy również pamiętać, że fragmentacja słowa dla HEAP nie ma żadnego znaczenia, jak zdefiniowałbyś fragmentację dla grupy niezamówionych stron.
Naprawdę martwiłem się o fragmentację
Jeśli naprawdę masz do czynienia ze scenariuszem, w którym tabela sterty jest pofragmentowana i spowalnia zapytania, lepiej byłoby utworzyć indeks klastrowany w tabeli niż odbudować go. Powodem jest to, że podczas przebudowywania sterty wszystkie bazowe indeksy nieklastrowane są również przebudowywane, co powoduje, że proces przebudowywania zajmuje znacznie więcej czasu, zużywa dużo zasobów i powoduje wzdęcie dziennika transakcji. W systemie produkcyjnym zawsze starano się tego uniknąć. Paul opisał to w swojej sekcji mitów o kupie .
PS: Nie używaj nieudokumentowanej komendy w systemie produkcyjnym. To było tylko na pokaz.