En algunas oportunidades de negocio, y en ciertas tareas, los desarrolladores crean nuevos indices sin investigar si realmente los indices existentes son suficientes para responder su consulta en tiempo y forma.
Ocasionalmente en lugar de modificar sus consultas para que usen alguno de los indices existentes observando el plan de ejecución, crean indices idénticos, o casi iguales.
La siguiente consulta no detecta la duplicidad de indices, el SQL Server se encarga solo de tomar el indice indicado para cada consulta, y en caso de que existiera alguno duplicado, el motor descarta a uno de los dos de manera natural.
La consulta para identificar estos casos es la siguiente:
SELECT
sch.name + '.' + tbl.name AS [Table Name],
ind.name AS [Index Name],
ind.index_id AS [Index_id],
ind.type_desc,
ISNULL(user_seeks + user_scans
+ user_lookups,0) AS [Total Reads
ISNULL(user_updates,0) AS [Total Writes],
ius.last_user_seek,
ius.last_user_scan ,
ius.last_user_lookup,
(ps.reserved_page_count*8.0)/1024 AS [SpaceUsed_MB]
FROM sys.indexes AS ind
FULL OUTER JOIN sys.dm_db_index_usage_stats AS ius
ON ius.object_id = ind.object_id
AND ius.index_id = ind.index_id
AND ius.database_id = db_id()
AND objectproperty(ius.object_id,'IsUserTable') = 1
INNER JOIN sys.tables AS tbl
ON ind.object_id = tbl.object_id
INNER JOIN sys.schemas AS sch
ON tbl.schema_id = sch.schema_id
LEFT OUTER JOIN sys.dm_db_partition_stats AS ps
ON ind.index_id = ps.index_id
AND ind.object_id = ps.object_id
--WHERE ius.object_id = object_id('InvoicingUnits')
WHERE ISNULL(user_seeks + user_scans
+ user_lookups,0) = 0
ORDER BY [Table Name], [index name]
Espero les sirva.
Saludos!.