martes, 25 de junio de 2013

SQL Server: Últimos accesos a una tabla

Es muy posible que en algún momento hayas pensado en que estaría bien saber cuándo ha sido el

último acceso

a una determinada

tabla

de tu base de datos

SQL Server

, ¿no se os ocurre ningún caso? Imaginemos que hemos modificado cierto código provocando que una

tabla

deje de utilizarse y pueda ser eliminada , ¿estamos seguros que ningún otro código o aplicación acceden a esa

tabla

? A continuación os explicaré cómo podemos saber la

última vez que una tabla ha sido accedida en SQL Server

.

Mediante el uso de la DMV (Dynamic Management View)

sys.dm_db_index_usage_stats

podemos obtener información sobre los

últimos accesos a una tabla en SQL Server

, para ello ejecutaremos la consulta:
-- Lanzamos una consulta sobre la tabla Employee de la BD AdventureWorks
SELECT * FROM HumanResources.Employee

-- Comprobamos los accesos
SELECT tab.name AS Tablename,
       user_seeks, user_scans, user_lookups, user_updates,
       last_user_seek, last_user_scan, last_user_lookup, last_user_update
FROM sys.dm_db_index_usage_stats ius 
INNER JOIN sys.tables tab ON (tab.object_id = ius.object_id)
WHERE database_id = DB_ID(N'AdventureWorks')
  AND tab.name = 'Employee'

Y obtendremos el siguiente resultado:


En cuanto al significado de las distintas columnas del resultado de la consulta:

  • Tablename, nombre de la

    tabla

    por la que estamos filtrando en el WHERE; si no filtramos obtendremos los últimos accesos a todas las tablas de la base de datos.

  • user_seeks, número de consultas de usuario que han utilizado un índice para la búsqueda.

  • user_scans, número de consultas de usuario que han recorrido toda la

    tabla

    .

  • user_lookups, número de consultas de usuario en las que se ha producido un salto del índice a la

    tabla

    para recuperar los datos.

  • user_updates, número de actualizaciones (INSERT / DELETE / UPDATE) que ha realizado un usuario sobre la

    tabla

    .

  • last_user_seek, fecha de la última consulta de usuario que ha utilizado un índice para la búsqueda.

  • last_user_scan, fecha de la última consulta de usuario que ha recorrido toda la

    tabla

    .

  • last_user_lookup, fecha de la última consulta de usuario en la que se ha producido un salto del índice a la tabla para recuperar los datos.

  • last_user_update, fecha de la última actualización (INSERT / DELETE / UPDATE) que ha realizado un usuario sobre la

    tabla

    .

En el ejemplo anterior, al hacer un SELECT sobre la

tabla

Employee se ha sumado 1 en la columna user_scans y se ha actualizado el valor de la columna last_user_scan con la fecha y hora en la que he ejecutado el SELECT. Si queréis más información sobre la DMV

sys.dm_db_index_usage_stats

podéis hacerlo a través de la página correspondiente del MSDN.

Un tema importante a tener en cuenta, los contadores se inicializan a 0 (para las columnas user_xxx) y NULL (para las columnas last_xxx) cada vez que se inicia el servicio

SQL Server

(MSSQLSERVER). Además, cada vez que una base de datos se pone fuera de conexión o se apaga (por ejemplo, porque se establece AUTO_CLOSE en ON), se eliminan todas las filas asociadas a la base de datos. Y hasta aquí el artículo de hoy, espero que os pueda ser útil en algún momento. Recordad también que dentro de

areaTIC

podéis encontrar otros artículos interesantes, no dudéis en consultar nuestro archivo, también podéis seguirnos por RSS o las principales redes sociales (twitter, facebook, linkedin...) 


LECTURAS RELACIONADAS RECOMENDADAS POR AREATIC.NET

4 comentarios:

daniel sepulveda dijo...

solo una nota.... mas que el uso de la tabla es el uso de los indices de la tabla.....la consulta te da de hecho un renglón por cada indice. se puede agrupar por tabla para "ver" mas claro el resultado..
SELECT tab.name AS TableName,
sum(user_seeks) AS user_seeks ,
sum(user_scans) AS user_scans,
sum(user_lookups) AS user_lookups,
avg(user_updates) AS user_updates,
max(last_user_seek) AS last_user_seek,
max(last_user_scan) AS last_user_scan ,
max(last_user_lookup) AS last_user_lookup,
max(last_user_update) AS last_user_update
FROM sys.dm_db_index_usage_stats ius
INNER JOIN sys.tables tab ON (tab.object_id = ius.object_id)
WHERE database_id = DB_ID(N'AdventureWorks')
GROUP BY tab.name
ORDER BY tab.name

David Berdié Escolano dijo...

Es correcto lo que indicas, sabemos los accesos a una tabla en función del uso de los índices de ésta; de hecho, el nombre de la DMV (dm_db_index_usage_stats) ya lo indica.

Por otro lado y respecto a la consulta, devuelve 1 línea por cada tabla + 1 línea por cada índice no clúster de la tabla; buena observación la que haces, muchas gracias!!

Wellington Moreta dijo...

excelente

David Berdié Escolano dijo...

Gracias Wellington!

Publicar un comentario en la entrada