Queries do Dia a Dia – Monitorando o Crescimento de Tabelas e Bases no SQL Server
Olá Pessoal,
Hoje vou compartilhar com vocês um Script que utilizo em todos os clientes que realizo um monitoramento diário do SQL Server.
É um script que irá armazenar diariamente o tamanho das tabelas de todas as bases de dados e, com isso, você conseguirá monitorar o quanto suas tabelas e base estão crescendo por dia, por mês ou por ano.
Essa informação é fundamental para você realizar um planejamento de espaço em disco do seu ambiente e definir quando será necessário realizar um novo investimento na compra de mais disco.
Para criar essa rotina, basta abrir o arquivo abaixo na base que deseja criar esse log e executar o script:
O script vai criar as tabelas abaixo:
- BaseDados
- Tabela
- Servidor
- Historico_Tamanho_Tabela
A view para facilitar a visualização das informações:
- vwTamanho_Tabela
E a procedure que fará a carga dos dados nas Tabelas:
- stpCarga_Tamanhos_Tabelas
Depois de executar o script, basta criar um job para executar a procedure stpCarga_Tamanhos_Tabelas diariamente.
Após executado, você pode conferir o tamanho das suas maiores tabelas com o Script abaixo:
SELECT top 10 *
FROM vwTamanho_Tabela
ORDER BY Nr_Tamanho_Total desc
Resultado:
Com essa informação sendo armazenada de forma diária no seu banco de dados, agora vai da criatividade de cada um para montar as queries e relatórios que precisam.
A informação está aí, é visualizar da forma que acha melhor montando uma consulta na view vwTamanho_Tabela.
É com essa rotina que gero as informações abaixo no meu CheckList diário do Banco de dados:
É um script simples, mas já está aí prontinho para vocês utilizarem. Ele é de grande ajuda para o DBA no seu Dia a Dia.
Gostou dessa dica?
Cadastre seu e-mail para receber novos Posts e curta minha Página no Facebook para receber Dicas de Leituras e Eventos sobre SQL Server.
Aprenda a criar essa e outras rotinas para administrar melhor seu SQL Server no meu Treinamento de Tarefas do Dia a Dia de um DBA.
Abraços,
Fabrício Lima
MCITP – Database Administrator
Consultor e Instrutor SQL Server
Trabalha com SQL Server desde 2006
Com este passo a passo ficou muito facil de aplicar esta rotina..
obrigado
Que bom que vai ajudar Fábio.
Obrigado.
Segue um exemplo de query para analisarem o histórico:
SELECT B.Nm_Servidor, Nm_Database,Nm_Tabela,
SUM(CASE WHEN Dt_Referencia = CONVERT(VARCHAR, GETDATE() ,112) THEN A.Nr_Tamanho_Total ELSE 0 END) Tamanho_Atual,
SUM(CASE WHEN Dt_Referencia = CONVERT(VARCHAR, GETDATE()-1 ,112) THEN A.Nr_Tamanho_Total ELSE 0 END) Tamanho_1_dia,
SUM(CASE WHEN Dt_Referencia = CONVERT(VARCHAR, GETDATE()-15 ,112) THEN A.Nr_Tamanho_Total ELSE 0 END) Tamanho_15_dia,
SUM(CASE WHEN Dt_Referencia = CONVERT(VARCHAR, GETDATE()-30 ,112) THEN A.Nr_Tamanho_Total ELSE 0 END) Tamanho_30_dia,
SUM(CASE WHEN Dt_Referencia = CONVERT(VARCHAR, GETDATE()-60 ,112) THEN A.Nr_Tamanho_Total ELSE 0 END) Tamanho_60_dia
FROM dbo.Historico_Tamanho_Tabela A
JOIN dbo.Servidor B ON A.Id_Servidor = B.Id_Servidor
JOIN dbo.Tabela C ON A.Id_Tabela = C.Id_Tabela
JOIN dbo.BaseDados D ON A.Id_BaseDados = D.Id_BaseDados
WHERE A.Dt_Referencia IN (CONVERT(VARCHAR,GETDATE(),112), CONVERT(VARCHAR,GETDATE()-1,112), CONVERT(VARCHAR,GETDATE()-15,112), CONVERT(VARCHAR, GETDATE()-30 ,112), CONVERT(VARCHAR, GETDATE()-60 ,112) ) –Hoje, 1 dia, 15 dias, 30 dias, 60 dias
GROUP BY B.Nm_Servidor, Nm_Database,Nm_Tabela
ORDER BY Tamanho_Atual desc
Parabéns Fabrício pelos os post. Só me diga uma coisa, os dados você informa que carrega para um arquivo. Pela imagem parece que usa excel. Em caso que não é permitido exportar os dados para o excel somente broffice ou não tem nenhum dos dois app instalado no servidor. Como você atual?
Abraços!
Olá Jeferson,
Não carrego dados para arquivos.
A imagem é de um HTML que vai dentro de um e-mail.
Amigo, Parabéns pelo seu post muito bom. Agora tentei executar no meu servidor de SQL e esta dando este erro e não sei como solucionar?
(383 row(s) affected)
Msg 468, Level 16, State 9, Procedure stpCarga_Tamanhos_Tabelas, Line 87
Cannot resolve the collation conflict between “Latin1_General_CI_AI” and “Latin1_General_CI_AS” in the equal to operation.
Msg 2809, Level 18, State 1, Line 2
The request for procedure ‘vwTamanho_Tabela’ failed because ‘vwTamanho_Tabela’ is a view object.
Esse erro acontece após executar o comando para gravar os dados das tabelas. exec stpCarga_Tamanhos_Tabelas;
Resolvido. Obrigado. Não estava executando o procedimento no banco MASTER.]
Ela pode ser executada em outros bancos, mas sua collation da instancia deve estar diferente das bases gerando o erro.
Olá André,
Seu problema é que sua collation da instancia está diferente da collation da base. Quem bom que já resolveu.
Fabricio, tudo bom?
Ao executar o processo na Master, eu percebi que ele já cria a rotina para todas as databases do server, certo?
Obrigado!
Olá Tatiane,
A rotina é para monitorar todas as databases sim.
Contudo, sugiro criar uma base especifica para guardar esse e outros logs.
Parabéns Fabrício. Excelente post e ótima contribuição.
Obrigado!
Bom dia Fabricio,
Podes enviar-me a Query SQL que mostra as consultas que mais consomem CPU no banco de dados QSL Server… Preciso monitorizar uma Stored procedure para não causar problemas de performance no meu banco de dados.
Olá,
Aqui tem esse e outros scripts:
https://www.sqlskills.com/blogs/glenn/sql-server-diagnostic-information-queries-for-december-2018/
Fiz uma pequena alteração no codigo as minhas necessidades para quem deseja, na tabela de tabelas, alterei para DATETIME ( querendo pegar a data e a hora e minutos que foi coletado, ) e na procedure alterei o procedimento gETDATE(), 112 para 20 , para poder carregar o time correto, devido rodar minha job a cada 6 horas, meu banco de dados tem um crescimento fora do comum apos a migração para 2016 vindo de um 2014, então preciso detectar em um tempo menor, fica a dica para quem precisar também!