Prácticas recomendadas de índices no utilizados

11

Según esta consulta, si veo una cantidad baja de lecturas totales (muy cerca de 0 o 0, como 1 o 2) y una cantidad alta o moderada de actualizaciones de usuario (no pude encontrar inserciones o eliminaciones con esta consulta) con un recuento de filas grandes, en teoría debería eliminar el índice.

SELECT DISTINCT
    OBJECT_NAME(s.[object_id]) AS ObjectName
       , p.rows TableRows
       , i.name AS [INDEX NAME]
       , (user_seeks + user_scans + user_lookups) AS TotalReads
       , user_updates UserUpdates
FROM sys.dm_db_index_usage_stats s
    INNER JOIN sys.indexes i ON i.[object_id] = s.[object_id] 
        AND i.index_id = s.index_id 
    INNER JOIN sys.partitions p ON p.object_id = i.object_id
WHERE OBJECTPROPERTY(s.[object_id],'IsUserTable') = 1
       AND s.database_id = DB_ID()
       AND i.name IS NOT NULL
ORDER BY (user_seeks + user_scans + user_lookups) ASC

Quiero verificar la precisión de esta suposición aquí. Por ejemplo, un índice que existe desde hace más de un año pero que nunca se ha leído, pero que está muy actualizado, parece que sería una mala idea tenerlo. ¿Hay algún escenario en el que esta suposición no sea válida?

DoubleVu
fuente

Respuestas:

15

Este DMV solo mantiene estadísticas desde el último reinicio de SQL Server; la vista se borra por completo y todo comienza desde cero.

Más importante aún, las filas en esta vista para cualquier índice específico se eliminan cuando se reconstruye ese índice (pero no cuando se reorganiza). Si está realizando un mantenimiento de índice regular, puede ser útil mirar los registros de mantenimiento y ver si alguno de los índices que está considerando eliminar podría haberse reconstruido recientemente.

Por lo tanto, tomar decisiones basadas en lecturas bajas desde el último reinicio, cuando el último reinicio puede haber sido para las actualizaciones del parche del martes de la semana pasada o el service pack de ayer, podría no ser prudente. O cuando realiza mantenimiento de índice, desde la última reconstrucción. Puede haber un informe que solo se ejecuta una vez al mes, o una vez al trimestre, o una vez al año, y lo ejecuta una persona importante e impaciente.

Además, puede haber un índice para algo que sucederá en el futuro que no conoces: una serie de informes que se están preparando para la temporada de impuestos, digamos.

Entonces, mi consejo es:

Use el DMV para identificar los índices candidatos que se eliminarán , pero no tome esa decisión en una burbuja: debe hacer el trabajo preliminar para determinar por qué podría existir un índice antes de descartarlo, incluso si parece que no se está utilizando actualmente. .

Aaron Bertrand
fuente
@AaronBertrand Entonces, ¿sería un buen complemento seguir un historial (junto con el momento del último reinicio)? Gracias por tu respuesta.
DoubleVu
1
@DoubleVu sí, es probable que valga la pena mantener instantáneas del historial de uso del índice para que pueda tomar decisiones informadas que no se vean afectadas por nada que pueda cambiar la salida del DMV de estadísticas de uso.
Aaron Bertrand
2

Sí, la vista solo tiene estadísticas desde el último reinicio. Para ayudar a mitigar eso, configuré un trabajo que ejecutó una consulta como la que publicó mensualmente por la mañana antes de que nuestra ventana de mantenimiento comenzara a capturar la información cada mes antes de que el servidor se reiniciara. Eso me permitió volver más atrás y observar las tendencias a lo largo del tiempo. También tuve una segunda consulta que se ejecutó buscando índices posiblemente perdidos.

Otra cosa a considerar es qué otros índices están en la tabla. Es posible que no se esté utilizando porque es en su mayoría o completamente un duplicado de otro índice. Si. El servidor SQL le permite crear dos índices diferentes pero idénticos, por lo que es posible que sea completamente redundante.

También puede ver cuál podría ser el plan de consulta para una consulta que usó ese índice si ese índice se eliminó. ¿Tendría que usar otro índice o probablemente tendría que recurrir a una exploración de tabla completa?

Los índices terminan siendo tanto arte como ciencia porque es realmente difícil saber todo sobre lo que se podría ejecutar y, de todos modos, termina cambiando con frecuencia.

Evan Steinbrenner
fuente