sqlrx logo
SQLRx® Tip of the Month
 
 
July 2010
Greetings!
 
If you are a DBA who needs to know how much space tables take in your databases to monitor growth trends and plan for maintenance, we have the query for you. 
 
And don't forget to regularly monitor the 11 VitalSigns used by SQLRx to debug performance bottlenecks.
 
______________________________________________________________________________
SQL 2008  SQL Server Administration:  List the row count and space used for data and indexes for each table in your database with the following query.  This is the same query that is run for the Disk Usage by Table report in Management Studio.  Databases that are in 80 or below compatibility cannot use the report but you can still find out usage with the query. 
 

 

SELECT

 DB_NAME() AS [DatabaseName],

 a3.name AS [SchemaName],

 a2.name AS [TableName],

 a1.rows AS [RowCount],

 (a1.reserved + ISNULL(a4.reserved,0))* 8 AS reserved,

 a1.data * 8 AS [DataKB],

 (CASE WHEN (a1.used + ISNULL(a4.used,0)) > a1.data THEN

   (a1.used + ISNULL(a4.used,0)) - a1.data ELSE 0 END) * 8 AS [IndexKB],

 (CASE WHEN (a1.reserved + ISNULL(a4.reserved,0)) > a1.used THEN

   (a1.reserved + ISNULL(a4.reserved,0)) - a1.used ELSE 0 END) * 8 AS unused

FROM

 (SELECT

  ps.object_id,

  SUM (

   CASE

    WHEN (ps.index_id < 2) THEN row_count

    ELSE 0

   END

   ) AS [rows],

  SUM (ps.reserved_page_count) AS reserved,

  SUM (

   CASE

     WHEN (ps.index_id < 2) THEN

   (ps.in_row_data_page_count + ps.lob_used_page_count + ps.row_overflow_used_page_count)

     ELSE (ps.lob_used_page_count + ps.row_overflow_used_page_count)

   END

   ) AS data,

  SUM (ps.used_page_count) AS used

 FROM sys.dm_db_partition_stats ps

 GROUP BY ps.object_id) AS a1

LEFT OUTER JOIN

 (SELECT

  it.parent_id,

  SUM(ps.reserved_page_count) AS reserved,

  SUM(ps.used_page_count) AS used

  FROM sys.dm_db_partition_stats ps

  INNER JOIN sys.internal_tables it ON (it.object_id = ps.object_id)

  WHERE it.internal_type IN (202,204)

  GROUP BY it.parent_id) AS a4 ON (a4.parent_id = a1.object_id)

INNER JOIN sys.all_objects a2  ON ( a1.object_id = a2.object_id )

INNER JOIN sys.schemas a3 ON (a2.schema_id = a3.schema_id)

WHERE a2.type <> 'S' and a2.type <> 'IT'

ORDER BY a3.name, a2.name

____________________________________________________________ 

SQLRx is a part of www.msdev.com, a Microsoft training site!  Check the site periodically to view new training videos.
 
If you have a SQL question you'd like us to answer, and possibly use for the next SQLRx Tip of the Month or msdev video, email it to us!  If you missed any of our previous tips, you can view them here.
 
For assistance or more information on optimizing your SQL Server Environment, visit us at www.sqlrx.com or email Lori Brown at lorib@isi85.com.  

Sincerely,

Lori Brown | SQLRx Senior Consultant | Integrated Services, Inc.
4144 N. Central Expwy, Suite 430  |  Dallas, TX  75204
Phone: 214.526.7680 x 113 | lorib@isi85.com 
 
 
Integrated Services, Inc.                                    
2008 winner logo small
Turning Data Into Profit
 
25 Years of Credibility & Trust
 

Join our email list          Check out our events          SQLRx Downloads