Baza danych SQL Server 2017 Enterprise CU16 14.0.3076.1
Niedawno próbowaliśmy przejść z domyślnych zadań konserwacyjnych Index Rebuild do Ola Hallengren IndexOptimize
. Domyślne zadania przebudowy indeksu działały przez kilka miesięcy bez żadnych problemów, a zapytania i aktualizacje działały z akceptowalnymi czasami wykonania. Po uruchomieniu IndexOptimize
w bazie danych:
EXECUTE dbo.IndexOptimize
@Databases = 'USER_DATABASES',
@FragmentationLow = NULL,
@FragmentationMedium = 'INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationHigh = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationLevel1 = 5,
@FragmentationLevel2 = 30,
@UpdateStatistics = 'ALL',
@OnlyModifiedStatistics = 'Y'
wydajność bardzo się pogorszyła. Instrukcja aktualizacji, która wcześniej zajęła 100 ms, IndexOptimize
zajęła później 78 000 ms (przy użyciu identycznego planu), a zapytania były również gorsze o kilka rzędów wielkości.
Ponieważ nadal jest to testowa baza danych (migrujemy system produkcyjny z Oracle), przywróciliśmy kopię zapasową i wyłączono, IndexOptimize
a wszystko wróciło do normy.
Chcielibyśmy jednak zrozumieć, co IndexOptimize
różni się od „normalnego”, Index Rebuild
co mogło spowodować ten ekstremalny spadek wydajności, aby mieć pewność, że unikniemy go po przejściu do produkcji. Wszelkie sugestie dotyczące tego, czego szukać, byłyby bardzo mile widziane.
Plan wykonania instrukcji aktualizacji, gdy jest ona wolna. tj.
po IndexOptimize
Rzeczywisty plan wykonania (jak najszybciej)
Nie byłem w stanie dostrzec różnicy.
Zaplanuj to samo zapytanie, gdy jest szybkie
Rzeczywisty plan wykonania