it-swarm.dev

Kiedy powinienem odbudować indeksy?

Kiedy powinienem odbudować indeksy w mojej relacyjnej bazie danych (SQL Server)?

Czy istnieje uzasadnienie dla regularnego przebudowywania indeksów?

57
Nick Chammas

Ryzykując, że w mojej odpowiedzi będę zbyt ogólny, powiem, że powinieneś regularnie przeprowadzać proces konserwacji indeksu. Jednak proces konserwacji indeksu powinien jedynie odbudowywać/reorganizować indeksy, które tego wymagają.

Rodzi to pytanie: kiedy indeks wymaga przebudowy lub reorganizacji? Rolando ładnie to poruszył. Znowu ryzykuję, że będę bardzo szeroki. Indeks wymaga konserwacji, gdy poziom fragmentacji niekorzystnie wpływa na wydajność. Ten poziom fragmentacji może się różnić w zależności od wielkości i składu indeksu.

Mówiąc o SQL Server, mam tendencję do wybierania rozmiaru indeksu i poziomu fragmentacji indeksu, w którym to momencie rozpoczynam konserwację indeksu. Jeśli indeks zawiera mniej niż 100 stron, nie będę wykonywać żadnych czynności konserwacyjnych.

Jeśli indeks jest podzielony między 10% a 30%, będę REORGANIZE indeks i UPDATE statystyki. Jeśli indeks jest podzielony w ponad 30%, będę REBUILD indeks - bez UPDATE STATISTICS, ponieważ zajmuje się tym REBUILD. Pamiętaj jednak, że przebudowa aktualizuje tylko obiekt statystyk bezpośrednio powiązany z indeksem. Pozostałe statystyki kolumn będą musiały być utrzymywane osobno.

Ta odpowiedź to naprawdę długa droga do powiedzenia: tak, powinieneś rutynowo konserwować indeksy, ale tylko na indeksach, które tego potrzebują.

42
Matt M

Kiedy powinienem odbudować indeksy w mojej relacyjnej bazie danych (np. SQL Server)?

Powinieneś odbudować indeksy, gdy staną się bardzo rozdrobnione przez zdarzenia specjalne. Na przykład wykonujesz duże, masowe ładowanie danych do indeksowanej tabeli.

Czy istnieje możliwość regularnego przebudowywania indeksów?

A co jeśli twoje indeksy ulegają fragmentacji w wyniku regularnej aktywności? Czy powinieneś planować regularne przebudowy? Jak często powinni biegać?

Tom Kyte , w tym klasyczny wątek Ask Tom , zaleca:

Odstęp czasu między odbudowaniami indeksu powinien wynosić w przybliżeniu NA ZAWSZE.

...

Nie wiem, jak to powiedzieć lepiej - indeks chce być duży i gruby z dodatkową przestrzenią. Jest w kolumnie, którą aktualizujesz - przenosząc pozycję indeksu z miejsca na miejsce w indeksie. Pewnego dnia wiersz ma kod „A”, następnego dnia kod „G”, następnie „Z”, następnie „H” i tak dalej. Tak więc wpis indeksu dla wiersza przesuwa się z miejsca na miejsce w indeksie. Gdy to robi, potrzebuje miejsca - jeśli nie będzie miejsca, podzielimy blok na dwie części - i zrobimy miejsce. Teraz indeks staje się gruby. Z czasem indeks ma 2-3 razy większy rozmiar niż na początku i jest „w połowie lub więcej pusty” Ale to jest OK, ponieważ przenosisz wiersze. Teraz, gdy przesuwamy rzędy, nie musimy już dzielić bloków, aby zrobić miejsce - pokój jest już dostępny.

Następnie przychodzisz, przebudowujesz lub upuszczasz i ponownie tworzysz indeks (które mają te same efekty - tylko odbudowa jest „bezpieczniejsza” - nie ma szansy na utratę indeksu i może być szybsza, ponieważ indeks można odbudować przez skanowanie istniejącego indeksu zamiast skanowania tabeli oraz sortowanie i budowanie nowego indeksu). Teraz cała ta ładna przestrzeń zniknęła. Ponownie rozpoczynamy proces dzielenia bloków - wracając do miejsca, w którym zaczęliśmy.

Nie zaoszczędziłeś miejsca.

Indeks wrócił do poprzedniego stanu.

Po prostu marnowałbyś czas na jego odbudowę, powodując powtarzanie się tego błędnego cyklu.

Logika tutaj jest zdrowa, ale jest tendencyjna w stosunku do profilu obciążenia dużego do odczytu.

Indeks „gruby” (tj. Z dużą ilością przerw) rzeczywiście zapewnia sporo miejsca na nowe i przeniesione wiersze, co zmniejsza podział stron i przyspiesza zapis. Jednak gdy czytasz z tego indeksu tłuszczu, musisz przeczytać więcej stron, aby uzyskać te same dane, ponieważ teraz przesiewasz więcej pustej przestrzeni. Spowalnia to twoje odczyty.

Tak więc w bazach danych z dużą ilością danych chcesz regularnie odbudowywać lub reorganizować swoje indeksy. (Jak często i pod jakimi warunkami? Matt M ma już konkretna odpowiedź na to pytanie.) W bazach danych, które doświadczają w przybliżeniu równoważnej aktywności odczytu i zapisu, lub w bazach danych, w których występuje duże obciążenie szkodzi wydajności bazy danych poprzez regularne przebudowywanie indeksów.

19
Nick Chammas

Większość ludzi regularnie je odbudowuje, aby nigdy nie uległy fragmentacji. Kiedy trzeba je odbudować, zależy to od tego, jak szybko ulegną fragmentacji. Niektóre indeksy będą musiały być często przebudowywane, inne w zasadzie nigdy. Sprawdź zrób skrypt SQLFool razem, który obsługuje wiele sposobów wymyślania tego dla Ciebie.

11
mrdenny

Jak zauważono w zaakceptowanej odpowiedzi Matta M., powszechną zasadą jest, że indeksy, które są podzielone na ponad 30%, powinny zostać odbudowane.

To zapytanie pomoże ci ustalić, ile indeksów masz podzielonych na ponad 30% (jeśli masz, powinieneś je odbudować):

SELECT DB_NAME() AS DBName,
       OBJECT_NAME(ind.object_id) AS TableName,
       ind.name AS IndexName,
       indexstats.index_type_desc AS IndexType,
       indexstats.avg_fragmentation_in_percent,
       indexstats.fragment_count,
       indexstats.avg_fragment_size_in_pages,
       SUM(p.rows) AS Rows 
  FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) AS indexstats
         INNER JOIN sys.indexes AS ind ON (    ind.object_id = indexstats.object_id
                                           AND ind.index_id = indexstats.index_id)
         INNER JOIN sys.partitions AS p ON (    ind.object_id = p.object_id
                                            AND ind.index_id = p.index_id)
 WHERE indexstats.avg_fragmentation_in_percent > 30
 GROUP BY
       OBJECT_NAME(ind.object_id),
       ind.name,
       indexstats.index_type_desc,
       indexstats.avg_fragmentation_in_percent,
       indexstats.fragment_count,
       indexstats.avg_fragment_size_in_pages 
 ORDER BY indexstats.avg_fragmentation_in_percent DESC
8
amandamaddox3

Kiedy powinienem odbudować indeksy?

Gdy procent fragmentacji indeksu jest większy niż 30%.

Czy istnieje uzasadnienie dla regularnego przebudowywania indeksów?

Nie ma takiego przypadku, ale ogólnie rzecz biorąc, wykonywanie indeksu konserwacji raz w tygodniu, w weekend jest najlepszą praktyką w celu utrzymania stabilności środowiska.

Polecam używanie skryptów konserwacyjnych Ola Hallengren (najlepsze skrypty konserwacyjne), dostosowywanie skryptów w zależności od środowiska i planowanie ich uruchamiania w weekend.

https://ola.hallengren.com/

Uwaga: nie zapomnij zaktualizować statystyk po przebudowaniu indeksów, ponieważ przebudowanie indeksów nie aktualizuje wszystkich statystyk.

5
KrishnaV

Tak jak w przypadku większości rzeczy w IT, to zależy. Jaki problem próbujesz rozwiązać, wykonując przebudowę indeksów? Czy możesz pokazać, że to naprawia problem? Jeśli tak, zmieniaj liczby, aż znajdziesz najmniejszą liczbę czynności konserwacyjnych, które musisz zrobić, aby rozwiązać problem.

Jeśli to nie rozwiąże problemu, lub powodem, dla którego to robisz, jest po prostu uspokojenie niektórych wskaźników, które monitorujesz, ponieważ może to poprawić, wtedy wszystko, co robisz, to spalanie procesora i IO = i prawdopodobnie pogorszenie twojego problemu.

Istnieje argument, że naprawienie fragmentacji nie zrobi żadnej różnicy dla twojego serwera, więc czy w ogóle warto to robić regularnie?

https://www.brentozar.com/archive/2017/12/index-maintenance-madness/

http://brentozar.com/go/defrag

1
Greg