Dlaczego nie odbudować indeksów z liczbą stron <1000?

17

Używam skryptu Ola Hallengrens do obsługi indeksu. Zanim to zrobiłem, użyłem następującego zapytania, aby zobaczyć, które indeksy są najbardziej pofragmentowane:

SELECT dbschemas.[name] as 'Schema',
dbtables.[name] as 'Table',
dbindexes.[name] as 'Index',
indexstats.avg_fragmentation_in_percent,
indexstats.page_count
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS indexstats
INNER JOIN sys.tables dbtables on dbtables.[object_id] = indexstats.[object_id]
INNER JOIN sys.schemas dbschemas on dbtables.[schema_id] = dbschemas.[schema_id]
INNER JOIN sys.indexes AS dbindexes ON dbindexes.[object_id] = indexstats.[object_id]
AND indexstats.index_id = dbindexes.index_id
ORDER BY indexstats.avg_fragmentation_in_percent desc

W moim przypadku avg_fragmentation wyniosło ponad 70% dla 15 indeksów i ponad 30% dla 28 indeksów.

Tak więc odbudowuję każdy indeks, korzystając z rozwiązania Oli Hallengren. Gdy ponownie uruchomiłem zapytanie, był to wynik:

Fragmentacja powyżej 70% dla 12 indeksów, ponad 30% dla 15 indeksów.

Pomyślałem, że powodem jest to page_count, że było niższe niż 1000 dla każdego z indeksów, które wciąż były bardzo rozdrobnione. Na przykład jeden z indeksów o page_count wartości 967 ma procent fragmentacji wynoszący 98,98% ! Wydaje mi się, że warto odbudować ten indeks! Zrobiłem to, a potem fragmentacja wyniosła 0% . Również wskaźnik z page_count132 spadł z 95% do 0%

Więc moje pytanie brzmi: jakie byłyby powody, by NIE odbudowywać tych indeksów? Jednym z powodów może być to, że odbudowa kosztuje czas i zasoby, ale ponieważ indeksy są małe, czy nie oznacza to, że kosztuje stosunkowo niewiele zasobów i nadal byłoby korzystne przy odbudowie?

Na tej stronie znajduje się wiele powiązanych pytań, ale wszystkie z nich odpowiadają na pytanie, dlaczego indeks nie byłby defragmentowany lub jeśli indeksy są nadal przydatne, jeśli są małe i nie defragmentuje się ich, podczas gdy tutaj instrukcja MNIE zmniejsza fragmentację, z pytanie brzmi: dlaczego i tak tego nie zrobić?

użytkownik1261104
źródło
Małe indeksy prawdopodobnie zostaną zapisane w pamięci podręcznej. Indeksy, które i tak nie powodują IO, nie korzystają z defragmentacji. Ta reguła liczenia 1000 stron jest heurystyczna.
usr

Odpowiedzi:

20

Wskazówki dotyczące minimalnej liczby stron są nieco arbitralne . Największe korzyści wynikające z ograniczenia fragmentacji to:

  1. Może poprawić wydajność odczytu z wyprzedzeniem dla skanów o dużym zasięgu; i
  2. Może to poprawić gęstość strony (liczbę wierszy na stronę)

Oba te czynniki są z definicji mniej ważne w przypadku małych indeksów.

Kontrargumentem dotyczącym odbudowy małych indeksów jest zasadniczo:

„Po co zawracać sobie głowę? Nie masz ważniejszych rzeczy do zmartwienia?”.

To powiedziawszy, przebudowa / reorganizacja nie jest darmowa. W niektórych przypadkach warto unikać dodatkowego wysiłku i generowania dzienników (na przykład, jeśli dziennik jest wysyłany / kopiowany przez sieć WAN z dowolnej liczby możliwych przyczyn - dublowanie, grupy dostępności, replikacja ...). Ponadto, chyba że (lub nawet w niektórych przypadkach) przebudowujesz online, przebudowa może wpłynąć na inne równoległe procesy poprzez blokowanie. Wreszcie w przypadku małych indeksów przebudowa może nawet nie zmniejszyć fragmentacji ze względu na przydziały z mieszanych zakresów (chyba że korzystasz z włączonej flagi śledzenia 1118 ).

Jeśli nadal czujesz się szczęśliwszy przy przebudowywaniu tych małych indeksów i nie masz nic przeciwko konsekwencjom, to zdecydowanie zmień wartość @PageCountLevelparametru przekazanego do procedury Oli.

Zobacz nagranie PASS TV z prezentacji Paula Randala na temat fragmentacji indeksu, aby poznać wszystkie szczegóły.

Możesz także zobaczyć, jak Brent Ozar mówi o tym, dlaczego fragmentacja indeksu nie ma znaczenia w SQL Server.

Paul White przywraca Monikę
źródło