Base de datos SQL Server 2017 Enterprise CU16 14.0.3076.1
Recientemente intentamos cambiar de los trabajos de mantenimiento predeterminados de Reconstrucción de índice a Ola Hallengren IndexOptimize
. Los trabajos predeterminados de reconstrucción de índice se ejecutaban durante un par de meses sin problemas, y las consultas y actualizaciones funcionaban con tiempos de ejecución aceptables. Después de ejecutar IndexOptimize
en la base de datos:
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'
El rendimiento fue extremadamente degradado. Una declaración de actualización que tardó 100 ms antes IndexOptimize
tomó 78,000 ms después (usando un plan idéntico), y las consultas también estaban realizando varios órdenes de magnitud peor.
Como todavía es una base de datos de prueba (estamos migrando un sistema de producción de Oracle) volvimos a una copia de seguridad y la deshabilitamos IndexOptimize
y todo volvió a la normalidad.
Sin embargo, nos gustaría entender qué IndexOptimize
es diferente de lo "normal" Index Rebuild
que podría haber causado esta degradación extrema del rendimiento para asegurarnos de evitarlo una vez que empezamos la producción. Cualquier sugerencia sobre qué buscar sería muy apreciada.
Plan de ejecución para la declaración de actualización cuando es lenta. es decir,
después de IndexOptimize
Plan de ejecución real (próximamente)
No he podido detectar una diferencia.
Planifique la misma consulta cuando sea rápida
Plan de ejecución real