Brains Coders

Brains Engineering Blog

Show Tables and Indexes by Size in SQL Server

To get a quick view of how many rows, total, used and unused space size each table has, in a Microsoft SQL Server database you can run the following query:

SELECT t.NAME AS TableName,s.Name AS SchemaName,p.rows AS RowCounts,(SUM(a.total_pages) * 8)/1024 AS TotalSpaceMB,   (SUM(a.used_pages) * 8)/1024 AS UsedSpaceMB, ((SUM(a.total_pages) - SUM(a.used_pages)) * 8)/1024 AS UnusedSpaceMB
FROM  sys.tables t
INNER JOIN sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN sys.allocation_units a ON p.partition_id = a.container_id
LEFT OUTER JOIN  sys.schemas s ON t.schema_id = s.schema_id
    t.NAME NOT LIKE 'dt%' 
    AND t.is_ms_shipped = 0
    AND i.OBJECT_ID > 255 
GROUP BY     t.Name, s.Name, p.Rows
ORDER BY     t.Name

The query for showing the indexes size is:

SELECT  OBJECT_NAME(i.object_id) AS TableName,  AS IndexName,
  i.index_id  AS IndexID,
  (8 * SUM(a.used_pages))/1024    AS 'Indexsize(MB)'
FROM  sys.indexes AS i
  JOIN sys.partitions AS p ON p.object_id = i.object_id AND p.index_id = i.index_id
  JOIN sys.allocation_units AS a ON a.container_id = p.partition_id
GROUP BY  i.OBJECT_ID, i.index_id,
ORDER BY  OBJECT_NAME(i.object_id),  i.index_id

there is also this stored procedure that shows everything at once:

USE [database_name];  
sp_msforeachtable N'EXEC sp_spaceused [?]';  

If you want to know the size of the entire database on filesystem, just call the sp_helpdb stored procedure