Últimas Operações das Tabelas – SQL Server

Nesse artigo eu mostrarei um script que retorna a última data de uma operação UPDATE e SELECT nas tabelas de um database.

O script retorna os seguintes campos:
Name: nome da tabela
User_Seeks: número de pesquisas feitas com o FORCESEEK
User_Scans: número de pesquisas feitas com o SCAN
User_Lookups: número de pesquisas de indicador através do LOOKUP
User_Updates: número de Updates realizados (operações como INSERT e UPDATE)
Last_User_Seek: data da última pesquisa utilizando o FORCESEEK
Last_User_Scan: data da última pesquisa utilizando o SCAN
Last_User_Lookup: data da última pesquisa utilizando o LOOKUP
Last_User_Update: data do último UPDATE

Antes é preciso adrentar-se a algumas observações:

Essa query utiliza uma DM chamada sys.dm_db_index_usage_stats. Essa DM retorna as operações realizadas em índices em cada tipo de operação.
É importante estar ciente que essa query não é 100% confiável quando se trata de operações como DELETE. Como ele retorna operações em índices, ele retorna apenas SELECT, INSERT e UPDATE.

Importante: Uma vez que a instância é reiniciada, a tabela qual a DM coleta as informações é zerada.

É preciso analisar com cuidado os resultados: quando uma tabela é consultada com o FORCESEEK e o SCAN, ele adiciona duas linhas para a mesma tabela. Uma linha contém o Last_User_Scan preenchido enquanto o Last_User_Seek está nulo, isso quando a consulta foi realizada com o SCAN. Na outra linha, o Last_User_Seek está preenchido enquanto o Last_User_Scan está nulo, isso quando a consulta foi realizada com FORCESEEK.

No script estou ordenando as últimas consultas realizadas pelo SCAN (Last_User_Scan), você pode alterar a última data conforme sua necessidade.

Obs.: estou apenas mostrando as operações feitas por usuários (NT e SQL). Existem outros campos que mostram as alterações feitas pelo SQL (System). Nesse link você pode verificar a documentação oficial no MSDN.

SELECT DISTINCT 
	 T.Name			
	,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 I 
JOIN
	sys.tables T 
ON 
	T.Object_ID = I.Object_ID
WHERE
	Database_ID = DB_ID()
ORDER BY
	Last_User_Scan DESC

Exemplo

Execute o seguinte script.

USE ALAN_TESTE
GO
CREATE TABLE tbTeste(Data datetime)
GO
INSERT INTO tbTeste VALUES(GETDATE())
INSERT INTO tbTeste VALUES(GETDATE())
INSERT INTO tbTeste VALUES(GETDATE())
GO
SELECT * FROM tbTeste 
GO
SELECT DISTINCT 
	 T.Name
	,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 I 
JOIN
	sys.tables T 
ON 
	T.Object_ID = I.Object_ID
WHERE
	Database_ID = DB_ID()
ORDER BY
	Last_User_Scan DESC

O resultado será esse:

index_usage

Veja que o campo User_Scans está com o valor = 1, ou seja, foi realizado uma consulta após o INSERT. O campo User_Updates está com o valor = 3, ou seja, foram realizados 3 inserções na tabela. E o Last_User_Scan está com a data em que foi realizado o SELECT e o Last_User_Update está com a data em que foi realizado o INSERT.

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s