2008-11-14 27 views
17

Es una tarea trivial averiguar si un objeto es referenciado por otra cosa o no. Lo que me gustaría hacer es identificar si se está usando o no en realidad.Identificación de objetos no utilizados en Microsoft SQL Server 2005

Mi solución originalmente involucraba una combinación de una tabla que contenía una lista de objetos en la base de datos y un trabajo por hora.

El trabajo hizo dos cosas. Primero, buscó nuevos objetos que se habían agregado a la base de datos desde la última ejecución. En segundo lugar, miró el caché de objetos de sql. Si un objeto de la tabla se incluyó en la caché, se marcó en la tabla como "visto" recientemente en uso.

Al final de un período de seis meses o lo que sea, se examinaron los contenidos de la tabla. Cualquier cosa mencionada en la tabla que no se haya visto desde que empecé a monitorear probablemente fue segura para hacer una copia de seguridad y eliminarla.

Claro, existe la posibilidad de objetos que solo se usan, por ejemplo, una vez al año o lo que sea, pero parece que funciona en su mayor parte.

Fue un poco doloroso trabajar con él.

Hay alrededor de media docena de bases de datos con las que estoy trabajando, la mayoría de las cuales tienen montones de tablas heredadas, que permanecen mucho tiempo después de que sus creadores originales pasaran a otras compañías.

Lo que estoy buscando es un método bastante confiable para realizar un seguimiento de cuándo se llama un objeto (tabla, vista, procedimiento almacenado o función).

Para aquellos de ustedes que actualmente monitorean este tipo de cosas, ¿qué método/código utilizan y lo recomendarían?

Respuesta

24

Con SQL Server 2005, puede usar la vista de administración dinámica sys.dm_db_index_usage_stats. El nombre dice "índice" pero eso es un poco engañoso: cada tabla tiene una entrada aquí, incluso si no tiene ningún índice. Aquí está una consulta útil de la revista SQL:

SELECT 
    t.name AS 'Table', 
    SUM(i.user_seeks + i.user_scans + i.user_lookups) 
    AS 'Total accesses', 
    SUM(i.user_seeks) AS 'Seeks', 
    SUM(i.user_scans) AS 'Scans', 
    SUM(i.user_lookups) AS 'Lookups' 
FROM 
    sys.dm_db_index_usage_stats i RIGHT OUTER JOIN 
    sys.tables t ON (t.object_id = i.object_id) 
GROUP BY 
    i.object_id, 
    t.name 
ORDER BY [Total accesses] DESC 

Aquí está el artículo original:

http://www.sqlmag.com/Article/ArticleID/53878/sql_server_53878.html

Tenga en cuenta que estas estadísticas de uso restablecen cuando se reinicia SQL Server.

+1

¿Cómo lo adapto para encontrar vistas no utilizadas y procedimientos almacenados? –

+1

@FunkySi lamentablemente, no puedes. SQL Server no rastrea datos similares para vistas o procedimientos almacenados. –

Cuestiones relacionadas