Dlaczego indeks REBUILD nie zmniejsza fragmentacji indeksu?

30

Użyłem ALTER INDEX REBUILD do usunięcia fragmentacji indeksu. W niektórych przypadkach REBUILD nie wydaje się usuwać tego fragmentacji. Jakie są powody, dla których REBUILD nie usuwa fragmentacji? Wydaje się, że dzieje się tak zwłaszcza przy małych indeksach.

jrara
źródło
Powiązane: dba.stackexchange.com/questions/5365/…
Mark Storey-Smith

Odpowiedzi:

39

Jeśli indeks jest bardzo mały (uważam, że mniej niż 8 stron) użyje różnych zakresów. Dlatego będzie wyglądać, jakby nadal istniała fragmentacja, ponieważ zasięg obudowy zawiera strony z wielu indeksów.

Z tego powodu, a także z faktu, że przy tak małym indeksie, że fragmentacja jest zwykle nieistotna, naprawdę powinieneś odbudowywać indeksy tylko z pewnym progiem strony. Najlepszą praktyką jest odbudowywanie pofragmentowanych indeksów, które mają minimum 1000 stron .

Thomas Stringer
źródło
34

Może się to zdarzyć również przy bardzo DUŻYCH indeksach.

Miałem kilka indeksów na stole z około 700 milionami wierszy, których nie mogłem defragmentować poniżej około 30%. Problem polegał na tym, że nie było wystarczającej ilości ciągłego wolnego miejsca w bazie danych, aby porządkować indeks kolejno.

Aby obejść bardzo duży indeks, który nie będzie defragmentowany, NAJLEPSZY rozwiązaniem jest wstępne zmierzenie rozmiaru nowej bazy danych i przeniesienie wszystkich obiektów do tej bazy danych, a następnie odtworzenie tam swoich indeksów.

JNK
źródło
1

Walczyłem z tym przez jakiś czas i podobnie jak JNK, myślałem, że problemem jest nadal wolne miejsce i fragmentacja fizyczna na dysku. Co jednak robisz w przypadku SSD SAN?

Teraz dowiedziałem się, że dobrym pomysłem może być uwzględnienie tylko index_level = 0. Tak to się dzieje w skrypcie Oli Hallengren.

Kolejna poprawa jest do zrobienia

 REBUILD With (maxdop = 1)

W ten sposób zapewniasz maksymalną poprawę.

vikjon0
źródło