Como determinar o tamanho das minhas tabelas no banco de dados SQL Server

28

Existe alguma função interna / procedimento armazenado / consulta útil para recuperar informações sobre o tamanho do MyTablebanco de dados do SQL Server?

Heisenberg
fonte
Esta resposta no SO possui um script bastante simples e não requer procedimento não documentado.
Shawn Melton
A resposta dada pelo AA.SC é muito útil, exceto que o identificador do banco de dados msdb precisa ser removido de todas as DMVs na associação. Tal como está, apenas reporta tabelas no próprio msdb!
WaitForPete

Respostas:

34

Para tabela única, você pode usar

sp_spaceused MyTable

Para todas as tabelas em um banco de dados, você pode usá-lo sp_msforeachtablecomo a seguir

CREATE TABLE #temp (
table_name sysname ,
row_count INT,
reserved_size VARCHAR(50),
data_size VARCHAR(50),
index_size VARCHAR(50),
unused_size VARCHAR(50))
SET NOCOUNT ON
INSERT #temp
EXEC sp_msforeachtable 'sp_spaceused ''?'''
SELECT a.table_name,
a.row_count,
COUNT(*) AS col_count,
a.data_size
FROM #temp a
INNER JOIN information_schema.columns b
ON a.table_name collate database_default
= b.table_name collate database_default
GROUP BY a.table_name, a.row_count, a.data_size
ORDER BY CAST(REPLACE(a.data_size, ' KB', '') AS integer) DESC
DROP TABLE #temp
aasim.abdullah
fonte
45

Se você não quiser escrever um script, também poderá abrir os 'Detalhes do Pesquisador de Objetos' muito subutilizados no SSMS (tecla de atalho F7).

Nível superior de detalhes do Pesquisador de objetos

No Nível Superior, abra a pasta Tabelas para obter uma lista de todas as tabelas no seu banco de dados.

Pode ser necessário customizar as colunas para ver o espaço usado. Isso pode ser feito clicando com o botão direito do mouse na linha do cabeçalho e escolhendo as colunas que você deseja exibir.

Tamanho dos dados da tabela no SSMS

Há muito mais dados como este disponíveis em Detalhes do Pesquisador de Objetos.

Mark Sinkinson
fonte
3
Muito melhor do que a abordagem de t-sql acima (que não funcionou para mim)
Orion Edwards
17

No SSMS, clique com o botão direito do mouse em Banco de Dados, selecione Relatórios, Relatórios Padrão, Uso de Disco pelas Principais Tabelas.

O relatório fornecerá o número de linhas e kilobytes usados ​​por tabela.

O senhor jura muito
fonte
2

Veja sys.dm_db_partition_stats ( http://msdn.microsoft.com/en-us/library/ms187737.aspx ).

Existem algumas consultas de exemplo nesse link e também em http://blogs.msdn.com/b/cindygross/archive/2010/04/02/dmv-series-sys-dm-db-partition-stats.aspx

Você pode modificar para atender às suas necessidades, por exemplo, filtrar / desabilitar índices não agrupados. Multiplique a contagem de páginas por 8 para obter o tamanho em KB e divida por 2 ^ 10 (= 1024) para converter para MB, se necessário.

O sp_spaceused ( http://msdn.microsoft.com/en-us/library/ms188776.aspx ) também fornecerá informações sobre o tamanho da tabela.

Andy Jones
fonte
2

Para obter informações sobre o tamanho da tabela, eu gosto de usar o seguinte script

SELECT  sc.name + '.' + t.NAME AS TableName,  
        p.[Rows],  
        ( SUM(a.total_pages) * 8 ) / 1024 AS TotalReservedSpaceMB, -- Number of total pages * 8KB size of each page in SQL Server  
        ( SUM(a.used_pages) * 8 ) / 1024 AS UsedDataSpaceMB,  
        ( SUM(a.data_pages) * 8 ) / 1024 AS FreeUnusedSpaceMB  
FROM    msdb.sys.tables t  
        INNER JOIN msdb.sys.schemas sc ON sc.schema_id = t.schema_id  
        INNER JOIN msdb.sys.indexes i ON t.OBJECT_ID = i.object_id  
        INNER JOIN msdb.sys.partitions p ON i.object_id = p.OBJECT_ID  
                                            AND i.index_id = p.index_id  
        INNER JOIN msdb.sys.allocation_units a ON p.partition_id = a.container_id  
WHERE   t.type_desc = 'USER_TABLE'  
        AND i.index_id <= 1  --- Heap\ CLUSTERED
        AND t.NAME='MYTableName' -- Replace with valid table name
GROUP BY sc.name + '.' + t.NAME,  
        i.[object_id],i.index_id, i.name, p.[Rows]  
ORDER BY ( SUM(a.total_pages) * 8 ) / 1024 DESC  
AA.SC
fonte
1

Vá para o banco de dados, clique com o botão direito do mouse e clique nos relatórios, nos relatórios padrão e no uso do disco por tabela. Isso fornecerá todos os arquivos desse banco de dados e seus registros, dados, índices etc.

SQLBen
fonte
0

você pode usar o seguinte script que calcula o volume para cada tabela e outro conjunto de resultados do total por base de dados

    SET NOCOUNT ON 
    IF OBJECT_ID('tempdb..#SpaceUsed') IS NOT NULL DROP TABLE #SpaceUsed

    CREATE TABLE #SpaceUsed 
    (
    TableName sysname ,
    [Rows] int ,
    [Reserved] varchar(20),
    [Data] varchar(20),
    [Index_Size] varchar(20),
    [Unused] varchar(20),
    [Reserved_KB] bigint,
    [Data_KB] bigint,
    [Index_Size_KB] bigint,
    [Unused_KB] bigint
    )

    DECLARE @CMD NVARCHAR(MAX) =''
    SELECT @CMD +='EXEC sp_spaceused ' +  ''''+QUOTENAME(TABLE_SCHEMA)+'.'+ QUOTENAME(TABLE_NAME)+''''+';'+CHAR(10)
    FROM INFORMATION_SCHEMA.TABLES 
    --PRINT @CMD

     INSERT INTO #SpaceUsed (TableName ,[Rows] , [Reserved], [Data] , [Index_Size] , [Unused] )
     EXEC sp_executesql @CMD



     UPDATE #SpaceUsed 
     SET [Reserved_KB] = CONVERT(BIGINT,RTRIM(LTRIM(REPLACE([Reserved] , ' KB', '')))),
         [Data_KB] = CONVERT(BIGINT,RTRIM(LTRIM(REPLACE([Data] , ' KB', '')))),
         [Index_Size_KB]= CONVERT(BIGINT,RTRIM(LTRIM(REPLACE([Index_Size] , ' KB', '')))),
         [Unused_KB]= CONVERT(BIGINT,RTRIM(LTRIM(REPLACE([Unused] , ' KB', ''))))


     SELECT TableName, [Rows], Reserved_KB , Data_KB , Index_Size_KB , Unused_KB ,  Data_KB / 1024.0 Data_MB , Data_KB / 1024.0 / 1024.0 Data_GB
     FROM #SpaceUsed
     ORDER BY Data_KB DESC 

     SELECT SUM(Reserved_KB) Reserved_KB , SUM(Data_KB) Data_KB, SUM(Index_Size_KB) Index_Size_KB , SUM(Unused_KB) Unused_KB ,SUM(Data_KB / 1024.0) Data_MB , SUM(Data_KB / 1024.0 / 1024.0) Data_GB
     FROM #SpaceUsed

     DROP TABLE #SpaceUsed
hkravitz
fonte