Database SQL Server 2017 Enterprise CU16 14.0.3076.1
Di recente abbiamo provato a passare dai lavori di manutenzione predefiniti di ricostruzione degli indici a Ola Hallengren IndexOptimize
. I lavori predefiniti di ricostruzione degli indici erano in esecuzione da un paio di mesi senza problemi e le query e gli aggiornamenti funzionavano con tempi di esecuzione accettabili. Dopo l'esecuzione IndexOptimize
sul database:
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'
le prestazioni sono state estremamente degradate. Una dichiarazione di aggiornamento che ha richiesto 100 ms prima IndexOptimize
ha richiesto 78.000 ms in seguito (utilizzando un piano identico), e le query hanno anche peggiorato diversi ordini di grandezza.
Dato che questo è ancora un database di test (stiamo migrando un sistema di produzione da Oracle) siamo tornati a un backup e disabilitato IndexOptimize
e tutto è tornato alla normalità.
Tuttavia, vorremmo capire cosa IndexOptimize
fa diversamente dal "normale" Index Rebuild
che potrebbe aver causato questo degrado estremo delle prestazioni al fine di assicurarci di evitarlo una volta che andremo in produzione. Qualsiasi suggerimento su cosa cercare sarebbe molto apprezzato.
Piano di esecuzione dell'istruzione di aggiornamento quando è lento. cioè
dopo IndexOptimize
Piano di esecuzione effettivo (disponibile al più presto)
Non sono stato in grado di individuare una differenza.
Pianificare la stessa query quando è veloce
Piano di esecuzione effettivo