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
fuente
La respuesta de John es la solución correcta, esto es solo una adición en cuanto a qué partes del plan de ejecución cambiaron y, por ejemplo, cómo detectar fácilmente las diferencias con el explorador Sentry One Plan
Al mirar todos los planes de consulta cuando su rendimiento se degradó, puede detectar fácilmente las diferencias.
Rendimiento degradado
Dos cuentas de más de 35 segundos de tiempo de CPU y tiempo transcurrido
Rendimiento esperado
Mucho mejor
La degradación principal es dos veces en esta consulta de actualización:
El plan de ejecución de esta consulta con rendimiento degradado
El plan de consulta estimado de esta consulta de actualización tiene estimaciones muy altas cuando se degradó el rendimiento:
Si bien en realidad (el plan de ejecución real) todavía tiene que funcionar, no es la cantidad loca que muestran las estimaciones.
El mayor impacto en el rendimiento son los dos escaneos y el hash match se une a continuación:
Escaneo real en rendimiento degradado # 1
Escaneo real en rendimiento degradado # 2
El plan de ejecución de esta consulta con el rendimiento esperado.
Cuando compara eso con las estimaciones (o datos reales) del plan de consulta con el rendimiento normal esperado, las diferencias son fáciles de detectar.
Además, los dos accesos a la tabla anteriores ni siquiera ocurrieron:
No ve esta eliminación en la combinación hash porque la entrada de compilación (superior) se inserta primero en la tabla hash. Luego, los valores cero se sondean en esta tabla hash, devolviendo valores cero.
fuente
Sin más información, solo podemos realizar puñaladas ligeramente informadas en la oscuridad, por lo que debe editar la pregunta para proporcionar un poco más. Por ejemplo, los planes de consulta para esa declaración de actualización para la que ha dado los tiempos, tanto antes como después de las operaciones de mantenimiento del índice, ya que los planes pueden diferir debido a que las estadísticas del índice se han actualizado ( https://www.brentozar.com/pastetheplan / es útil para esto, en lugar de llenar la pregunta con lo que podría ser una gran parte de XML o dar una captura de pantalla que no incluye parte de la información pertinente que contiene el texto del plan).
Sin embargo, hay dos puntos muy simples:
fuente