Conocer los índices inutilizados de una base de datos

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:

  • OBJECT_SCHEMA_NAME: Como su nombre lo indica, obtiene el njombre de un esquema a apartir de un object_id determinado.
  • OBJECT_NAME: Obtiene el nombre de un objeto a partir de un object_id determinado.
  • OBJECTPROPERTY: Retorna informacion acerca del esquema actual de la base de datos, para mas informacion acerca de esta funcion visitar este link.

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!!

Proco

Software engineer, Gamer, Husband.

Deja un comentario

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