Niedawno dowiedziałem się, że jedna tabela sterty ma fragmentację powyżej 70%. Więc postanowiłem zrobić
ALTER TABLE dbo.myTable REBUILD
Zabawne, potem miałem 20% fragmentacji. Odtąd nie było na tym stole żadnego zapisu. Więc postanowiłem zrobić przebudowę jeszcze raz.
Po 2 razach stół rozdrabnia 50% fragmentacji, więc jeszcze więcej! Naprawdę nie rozumiem, jak to się może stać ...
sql-server
fragmentation
heap
tuxmania
źródło
źródło
Odpowiedzi:
Co oznacza fragmentacja w kupie
Stwierdzono, że wartość fragmentacji w Sterty, którą otrzymujesz z kolumny
avg_fragmentation_in_percent
poprzez zapytaniesys.dm_db_index_physical_stats
DMVDalej ten sam BOL tak mówi
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ę.
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łobyA 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 strony280
. 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.
źródło
Heaptest
i dawał wynik. Jestem pewien, że coś przegapiłeś. Tylko upewnij się, że poziom kompatybilności nie jest 80 w tym przypadku funkcja db_id źle działa