Identificar indices mas costosos no utilizados
Las operaciones de Inserción, actualización y eliminación provocan un mantenimiento a los índices relacionados a nuestra tabla. Recordemos que SQL determina el mejor camino (plan de ejecución) con el que resolverá una consulta, se apoya en las estadísticas de las columnas de las tablas involucradas y en el porcentaje de fragmentación de los índices, si bien es cierto que podemos forzar el uso de un índice cuando se resuelve una consulta esto debe hacerse solo en casos extremos y con un amplio análisis.
El punto al cual pretende dirigir esta tema es que si un índice no esta siendo usado por SQL , su presencia puede afectar el desempeño de nuestras consultas ,por lo cual es importante identificarlos y borrarlos una vez que hemos comprobado que las columnas involucradas tie-nen sus estadísticas actualizadas y que a pesar de eso SQL no los usa.
Una vez mas nos apoyaremos en las vistas dinámicas del sistema , sys.dm_db_index_usage_stats es el nombre de la vista que usaremos y las columnas de nuestro interés son:
database_id : Id. de la base de datos en la que se define la tabla o vista.
object_id : Id. de la tabla o vista en la que se define el índice.
index_id : Id. del índice.
user_seeks : Número de consultas de búsqueda realizadas por el usuario.
user_scans : Número de consultas de recorrido realizadas por el usuario.
user_lookups : Número de búsquedas de marcadores realizadas por consultas de usuario.
user_updates : Número de consultas de actualización realizadas por el usuario.
last_user_seek : Hora en que el usuario realizó la última búsqueda.
last_user_scan : Hora en que el usuario realizó el último recorrido.
last_user_lookup : Hora de la última búsqueda del usuario.
last_user_update : Hora en que el usuario realizó la última actualiza-ción.
system_seeks : Número de consultas de búsqueda realizadas por el sistema.
system_scans : Número de consultas de recorrido realizadas por el sistema.
system_lookups : Número de búsquedas realizadas por consultas del sistema.
system_updates : Número de consultas de actualización realizadas por el sistema.
Para recolectar la información correspondiente a los índices más costosos no utilizados de-berán ejecutar el siguiente script :
SELECT OBJECT_NAME(ind.object_id) [Tabla], ind.name [Indice]
FROM Sys.Indexes ind
INNER JOIN Sys.Objects obj ON obj.object_id = in-d.object_id
WHERE OBJECTPROPERTY(obj.object_id,'IsUserTable') = 1
AND NOT EXISTS
(SELECT 1 FROM Sys.dm_db_index_usage_stats usg
WHERE usg.object_id = ind.object_id
AND usg.index_id = ind.index_id
AND ind.index_id = usg.index_id
) and ind.name is not null
ORDER BY
[Tabla],
[Indice]
Referencias
http://technet.microsoft.com/es-mx/library/ms188755.aspx
No hay comentarios:
Publicar un comentario