Como posso determinar quais tabelas estão causando o crescimento do banco de dados ao longo do tempo?

8

Eu tenho um banco de dados no SQL Server 2008 que cresce o tempo todo e gostaria de saber quais tabelas causaram maior crescimento nos últimos 6 meses.

kashif
fonte
Você pode usar uma combinação de T-SQL e PowerShell - Monitorando o crescimento da tabela com o PowerShell para monitorar e fazer tendências ao longo do tempo.
Kin Shah
Até onde você tem backups? Você pode restaurar os mais antigos e olhar para as tabelas, registrar as informações e comparar dessa maneira depois de restaurar cada um.
Ali Razeghi
Que tipo de informação você tem em suas tabelas? Se incluir informações sobre o tipo de auditoria, como um last_updated_atcarimbo de data / hora, você pode fazer algumas boas sugestões.
Clockwork-Muse
Você pode verificar esta resposta anterior para começar. Mas provavelmente a lista de Aaron é o caminho a seguir, escolha uma solução e construa nela. Além disso, verifique o que está crescendo: é o arquivo de dados ou pode ser o arquivo de log?
Marian

Respostas:

15

O SQL Server não rastreia essas informações. Você precisaria de algum tipo de monitoramento (seja uma ferramenta ou caseiro) que mantenha instantâneos do espaço da tabela ao longo do tempo, daqui para frente. Isso pode ser simples ou complexo:

  • Visualizando o relatório Os destaques do @Zane em sua resposta e salvando o arquivo de vez em quando;
  • Tirar seus próprios instantâneos periódicos de visualizações como sys.dm_db_partition_stats;
  • Observando cópias restauradas de backups mais antigos, conforme sugerido pelo @Ali - no entanto, quem sabe até onde seus backups vão e se o espaço em disco for um problema, talvez você não tenha o luxo de restaurar vários deles para comparações lado a lado de qualquer forma.
  • Usando uma ferramenta externa como o PowerShell para automatizá-lo, como o artigo @Kin aponta ;
  • Usando uma ferramenta de monitoramento completa que rastreia espaço, fragmentação etc. ao longo do tempo (Isenção de responsabilidade: eu trabalho para o SQL Sentry).

Além de já ter implementado um ou mais desses métodos, ou alguém ter inventado uma máquina do tempo, não há realmente nenhuma maneira de descobrir o tamanho de uma tabela há 6 meses, ou duas semanas atrás ou 20 minutos atrás.

Aaron Bertrand
fonte
13

Se você não capturou e armazenou essas métricas de alguma forma, não há como ver o histórico. No entanto, você pode facilmente ver quais tabelas estão usando mais disco agora, se isso ajudar.

RightClick

Zane
fonte
2

Eu executo isso diariamente em um banco de dados de clientes para acompanhar o crescimento de tabelas individuais ao longo do tempo.

DECLARE @names TABLE (
 tableName VARCHAR(128)
 )

INSERT INTO @names
SELECT [name] FROM customerdb.dbo.sysobjects WHERE xtype='U'

WHILE (SELECT COUNT(tableName) FROM @names) > 0
BEGIN

    DECLARE @thisTable VARCHAR(128)
    SET @thisTable = (SELECT TOP 1 tableName FROM @names)
    INSERT INTO mydb.dbo.mytable ([name], [rows], [reserved], [data], [index_size], [unused])
    EXEC sp_spaceused @objname=@thisTable

    DELETE FROM @names
    WHERE tableName = @thisTable

END
user41207
fonte
1

Eu tenho um agendamento de scripts SQL em um trabalho para executar toda semana. Tente escrever um script que obtenha todas as informações de sp_spaceused, sys.schemas e sys.tables. e Coloque isso em uma tabela com a data criada. (e você pode começar a monitorar o futuro)

Mas se você deseja descobrir o crescimento da tabela nos meses anteriores e se você não configurou nenhum script ou trabalho, provavelmente precisará restaurar o backup em um ambiente de teste e olhar para a tabela mais alta e comparar o quanto ela cresceu através do tempo.

Lydia Simeane
fonte
5
Por que não compartilhar seu script?
Erik Darling
-2

Como faço no MySQL sem ferramentas extras:

Execute uma consulta como "SHOW TABLE STATUS" e salve o resultado em uma tabela com um campo de carimbo de data / hora extra.

Com esses dados, você tem um histórico de cada tabela e pode escolher suas tabelas quanto ao tamanho dos dados, linhas ou maior diff. hora extra.

Como os dados de status não têm muitos bytes, você pode executá-los com um cronjob diário. Funciona perfeito, fácil e de graça com comandos a bordo.

.

Mesmo procedimento como o link que Marian postou antes. O comando MS T-SQL deve ser algo como "SELECT * FROM INFORMATION_SCHEMA.TABLES" - apenas no google. Encontrei 2 soluções possíveis em segundos:

Listando todas as tabelas em um banco de dados e suas contagens e tamanhos de linha: http://www.sqlmatters.com/Articles/Listing%20all%20tables%20in%20a%20database%20and%20their%20row%20counts%20and%20sizes.aspx

SQL SERVER - Consulta para encontrar o número de linhas, colunas e ByteSize para cada tabela: http://blog.sqlauthority.com/2007/01/10/sql-server-query-to-find-number-rows-columns-bytesize- para cada tabela no banco de dados atual, encontre a maior tabela no banco de dados /

Rossi
fonte