Verificando tamanho das tabelas no SQL Server

Olá pessoal…

Hoje vou mostrar como verificar todas as tabelas de um esquema no SQL Server, e todos os tamanhos em KB.


SQL Server

SQL Server

Para fazer uma busca pegando todas as tabelas, precisamos relacionar sys.tables com o sys.schemas.

Para pegar o tamanho, é necessário relacionar o sys.indexes com o sys.tables, o sys.partitions com o sys.indexes e por último o sys.allocation_units com o sys.partitions.

Ficando similar a:

FROM 
    sys.tables tabelas
	INNER JOIN sys.schemas esquemas ON (
		esquemas.schema_id = tabelas.schema_id
	)
	INNER JOIN sys.indexes indices ON (
		tabelas.OBJECT_ID = indices.object_id
	)
	INNER JOIN sys.partitions particoes ON (
		indices.object_id = particoes.OBJECT_ID 
		AND indices.index_id = particoes.index_id
	)
	INNER JOIN sys.allocation_units alocacao ON (
		particoes.partition_id = alocacao.container_id
	)

Depois basta filtrar os dados para trazer somente as tabelas e o agrupamento dos dados. Abaixo um print da consulta executada.

Consulta executada

Consulta executada

Abaixo o código completo:

SELECT 
    esquemas.Name AS Esquema_Nome,
    tabelas.NAME AS Tabela_Nome,
    particoes.rows AS Numero_Linhas,
    SUM(alocacao.total_pages) * 8 AS Espaco_KB_Total, 
    SUM(alocacao.used_pages) * 8 AS Espaco_KB_Usado, 
    (SUM(alocacao.total_pages) - SUM(alocacao.used_pages)) * 8 AS Espaco_KB_Sem_Uso

FROM 
    sys.tables tabelas
	INNER JOIN sys.schemas esquemas ON (
		esquemas.schema_id = tabelas.schema_id
	)
	INNER JOIN sys.indexes indices ON (
		tabelas.OBJECT_ID = indices.object_id
	)
	INNER JOIN sys.partitions particoes ON (
		indices.object_id = particoes.OBJECT_ID 
		AND indices.index_id = particoes.index_id
	)
	INNER JOIN sys.allocation_units alocacao ON (
		particoes.partition_id = alocacao.container_id
	)

--Filtra somentes tabelas, filtra somente as criadas por usuário
WHERE 
    tabelas.NAME NOT LIKE 'dt%'
    AND tabelas.is_ms_shipped = 0
    AND indices.OBJECT_ID > 255 

--Agrupando pela Tabela, Esquema e Número de linhas
GROUP BY 
    tabelas.Name, esquemas.Name, particoes.Rows

--Ordenando pelo esquema, seguido pelas tabelas
ORDER BY 
    Esquema_Nome, Tabela_Nome

Referências:
stackoverflow.com/questions/7892334/get-size-of-all-tables-in-database

Bom pessoal, por hoje é só.
Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

2 Responses

  1. Patini disse:

    O Daniel San eh fera, e este foi mais um post show de bola. Vlw meu amigo.

Deixe uma resposta

Terminal de Informação