Menu

Conocer los índices inutilizados de una base de datos

diciembre 11, 2010 - SQL Server

No vamos a discutir la importancia de los indices ni si es bueno tener muchos o pocos, pero definitivamente el hecho de tener un índice que no es utilizado básicamente lo único que hace es ocupar espacio y mas aún si éste índice tiene un gran tamaño, porque puede afectar primero el rendimiento al realizar operaciones intensivas de inserción (como un bulk copy) y el tamaño propio del indice que ya hablamos como conocerlo en este post. Siguiendo con este ejemplo, digamos que no nos acordamos de el índice que habíamos creado, y un buen día como buenos desarrolladores de base de datos que somos estamos haciéndole mantenimiento a nuestra adorada, y queremos conocer que índice no están siendo utilizados, asi que ejecutamos la siguiente consulta:

SELECT OBJECT_SCHEMA_NAME(I.OBJECT_ID) AS SchemaName,
	OBJECT_NAME(I.OBJECT_ID) AS ObjectName, I.NAME AS IndexName
FROM sys.indexes I
WHERE OBJECTPROPERTY(I.OBJECT_ID, 'IsUserTable') = 1
	AND NOT EXISTS (
		SELECT index_id
		FROM sys.dm_db_index_usage_stats
		WHERE OBJECT_ID = I.OBJECT_ID AND I.index_id = index_id	AND database_id = DB_ID())
ORDER BY SchemaName, ObjectName, IndexName

Explicación

En la consulta mostrada vemos el uso de varias funciones:

Creo que que lo mas ‘extraño’ del query es la subconsulta la cual pergunta por la existencia del indice en la tabla sys.dm_db_index_usage_stats, que contiene informacion estadistica de uso de los indices en las consultas asi que es sencillo, si no esta en esa tabla es porque el índice no se usa :D, sencillo no?.

Como podemos observar en la salida, se nos muestra el esquema al cual pertenece el indice (OBJECT_SCHEMA_NAME(I.OBJECT_ID)), el nombre de la tabla en la que esta el indice (OBJECT_NAME(I.OBJECT_ID)) y como tal el nombre del indice (I.NAME). Happy coding!!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *