2010-01-08 26 views
8

Tengo una base de datos transaccional de alta demanda que creo que está sobreindexada. Originalmente, no tenía índices en absoluto, por lo que agregar algunos para procesos comunes hizo una gran diferencia. Sin embargo, con el tiempo, hemos creado índices para acelerar las consultas individuales, y algunas de las tablas más populares tienen de 10 a 15 índices diferentes y, en algunos casos, los índices son solo ligeramente diferentes entre sí, o son mismas columnas en un orden diferente.SQL Server: cómo determinar si los índices no se están utilizando?

¿Existe una forma directa de ver la actividad de la base de datos y saber si ya no se muestran los índices, o cuál es su porcentaje de uso? Me preocupa que los índices se hayan creado para acelerar una única consulta diaria/semanal, o incluso una consulta que ya no se está ejecutando, pero el índice todavía debe mantenerse actualizado cada vez que cambian los datos.

En el caso de las tablas de alto tráfico, eso es una docena de veces/segundo, y quiero eliminar los índices que reducen las actualizaciones de datos a la vez que proporcionan solo una mejora marginal.

Respuesta

10

Mire el número de búsquedas/escaneos/búsquedas del usuario y el último usuario que busca/escanea/busca en sys.dm_db_index_usage_stats. Estas estadísticas se restablecen al inicio del servidor, por lo que tendría que verificar después de que el servidor estaba funcionando y ejecutando una carga relevante por suficiente tiempo.

+1

Esto es exactamente lo que quería saber: hay muchos índices en los que las columnas USUARIO y SISTEMA (búsquedas, búsquedas y escaneos) son todos 0 y eso sugiere que esos índices no están funcionando para nada . – SqlRyan

1

El asistente de ajuste de la base de datos será útil aquí. Use el Analizador para registrar un conjunto estándar de consultas en el transcurso de un par de horas, y use ese archivo de rastreo en el Asistente de ajuste para identificar posibles índices redundantes.

+0

La respuesta de Remus es también una forma de ver esto. –

3

Si está en SQL Server 2005/2008, debe usar Database Tuning advisor.

Puede especificar que se ejecute durante un período de tiempo determinado, y recopilará estadísticas sobre qué se está utilizando y qué no. Al final de la ejecución, obtendrá algunas observaciones muy útiles sobre qué hacer para optimizar su estrategia de indexación.

4

Este script se verá en el DMV (vistas de gestión dinámica) y encontrará los índices que no se han utilizado.

DECLARE @dbid INT 

SELECT @dbid = DB_ID(DB_NAME()) 

SELECT 
    OBJECTNAME = OBJECT_NAME(I.OBJECT_ID), 
    INDEXNAME = I.NAME, 
    I.INDEX_ID 
FROM  
    SYS.INDEXES I 
JOIN 
    SYS.OBJECTS O ON I.OBJECT_ID = O.OBJECT_ID 
WHERE  
    OBJECTPROPERTY(O.OBJECT_ID, 'IsUserTable') = 1 
    AND I.INDEX_ID NOT IN 
     (SELECT S.INDEX_ID 
     FROM SYS.DM_DB_INDEX_USAGE_STATS S 
     WHERE S.OBJECT_ID = I.OBJECT_ID 
     AND I.INDEX_ID = S.INDEX_ID 
     AND DATABASE_ID = @dbid) 
ORDER BY 
    OBJECTNAME, I.INDEX_ID, INDEXNAME ASC 

mente que - el DMV está dinámica - por ejemplo, se restablecen a "nada" cada vez que reinicia sus servicios de SQL Server. ¡No los verifique si su servidor ha estado activo solo por unos minutos! Casi todos los índices aparecerán en su conjunto de resultados ......

Pero si puede controlar el conjunto de resultados de esta consulta a lo largo del tiempo, definitivamente debe tener una idea de qué índices no se están utilizando. Muy útil de hecho!

Cuestiones relacionadas