简体   繁体   中英

How can I get all table names, row counts and their data sizes in a SQL Server 2012 database?

I need to analyze my database. I want to get all table names, their record counts and actual data size of these tables. As you know, record count sometimes may be low but actual size of table can be very high.

Do you have such a script?

Will this work for you? It's a script I use:

 SELECT 
    S.name +'.'+ T.name as TableName, 
    Convert(varchar,Cast(SUM(P.rows) as Money),1) as [RowCount],
    Convert(varchar,Cast(SUM(a.total_pages) * 8 as Money),1) AS TotalSpaceKB, 
    Convert(varchar,Cast(SUM(a.used_pages) * 8 as Money),1) AS UsedSpaceKB, 
    (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB
FROM sys.tables T
INNER JOIN sys.partitions P ON P.OBJECT_ID = T.OBJECT_ID
INNER JOIN sys.schemas S ON T.schema_id = S.schema_id
INNER JOIN sys.allocation_units A ON p.partition_id = a.container_id
WHERE T.is_ms_shipped = 0 AND P.index_id IN (1,0)
GROUP BY S.name, T.name
ORDER BY SUM(P.rows) DESC

By the way, I cast the counts as money so I can get commas.

Another method using CURSOR and temp table.

IF OBJECT_ID(N'tempdb..[#TableSizes]') IS NOT NULL
  DROP TABLE #TableSizes ;
GO

CREATE TABLE #TableSizes
  (
    TableName nvarchar(128)  
  , [RowCount] int
  , ReservedSpaceKB int
  , DataSpaceKB int
  , IndexSizeKB int
  , UnusedSpaceKB int
  ) ;
GO

DECLARE RecCountCursor CURSOR FOR 
    SELECT S.name+'.'+T.name AS TableName
    FROM Sys.tables T INNER JOIN sys.schemas S ON (S.schema_id = T.schema_id)
    WHERE S.principal_id = 1
    ORDER BY TableName

OPEN RecCountCursor ;
DECLARE @TableName nvarchar(128) ;  

FETCH RecCountCursor INTO @TableName ;
WHILE ( @@FETCH_STATUS = 0 )
BEGIN    
    CREATE TABLE #TempTableSizes
      (
        [TableName] nvarchar(128)  
      , [RowCount] char(11)   
      , [ReservedSpace] varchar(18)
      , [DataSpace] varchar(18)    
      , [IndexSize] varchar(18)    
      , [UnusedSpace] varchar(18)  
      ) ;

    INSERT INTO #TempTableSizes
            exec sp_spaceused @objname = @TableName;       
    UPDATE #TempTableSizes SET [TableName] = @TableName;
    INSERT INTO #TableSizes
        SELECT [TableName], [RowCount], 
            SUBSTRING([ReservedSpace], 1, CHARINDEX(' KB', [ReservedSpace])), 
            SUBSTRING([DataSpace], 1, CHARINDEX(' KB', [DataSpace])),
            SUBSTRING([IndexSize], 1, CHARINDEX(' KB', [IndexSize])),
            SUBSTRING([UnusedSpace], 1, CHARINDEX(' KB', [UnusedSpace]))
         FROM #TempTableSizes
    DROP TABLE #TempTableSizes; 

    FETCH RecCountCursor INTO @TableName ;   
  end

CLOSE RecCountCursor ;     
DEALLOCATE RecCountCursor ;


SELECT *
FROM    [#TableSizes]
ORDER BY [ReservedSpaceKB] DESC ;

DROP TABLE #TableSizes ;

Use:

SELECT @@servername;

IF EXISTS(SELECT name FROM tempdb.sys.tables WHERE name LIKE '#spaceUsed%')
    BEGIN
        DROP TABLE #spaceUsed;
    END;
CREATE TABLE #spaceUsed  (
name VARCHAR(255) ,
rows INT ,
reserved VARCHAR(50) ,
data VARCHAR(50) ,
index_size VARCHAR(50) ,
unused VARCHAR(50));

EXEC sp_msforeachtable
@command1 =' 
--
INSERT INTO #spaceUsed
exec sp_spaceused N''?'';
'
,@whereand = ' And Object_id In (Select Object_id From sys.objects
Where SCHEMA_NAME(Schema_ID) like ''%'')';

DECLARE
   @spaceUsedData TABLE  (
   name VARCHAR(255) ,
   rows INT ,
   reservedMB BIGINT NULL ,
   dataMB BIGINT NULL ,
   index_sizeMB BIGINT NULL ,
   unusedMB BIGINT NULL);

INSERT INTO @spaceUsedData (name , rows , reservedMB ,  dataMB ,index_sizeMB ,unusedMB)
SELECT                  name , rows ,
Convert ( BIGINT ,Ltrim(Rtrim(Replace(reserved ,'KB' ,'')) ))/1024 ,
Convert ( BIGINT ,Ltrim(Rtrim(Replace(data ,'KB' ,'')) ))/1024 ,
Convert ( BIGINT ,Ltrim(Rtrim(Replace(index_size ,'KB' ,'')) ))/1024 ,
Convert ( BIGINT ,Ltrim(Rtrim(Replace(unused ,'KB' ,'')) ))/1024
FROM #spaceUsed;

SELECT * , reservedMB+  dataMB+index_sizeMB+unusedMB AS TotalMB FROM @spaceUsedData
ORDER BY rows DESC;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM