uhateoas
10/6/2014 - 7:35 AM

Viewing the size of your database objects

Viewing the size of your database objects

SELECT --- Schema, type and name of object and index:
       REPLACE(obj.type_desc, '_', ' ') AS objectType,
       sch.[name]+'.'+obj.[name] AS objectName,
       ISNULL(ix.[name], '') AS indexName,
       ix.type_desc AS indexType,

       --- Partition number, if there are partitions:
       (CASE COUNT(*) OVER (PARTITION BY ps.[object_id], ps.index_id)
             WHEN 1 THEN ''
             ELSE CAST(ps.partition_number AS varchar(10))
             END) AS [partition],

       --- Storage properties:
       p.data_compression_desc AS [compression],
       ds.[name]+ISNULL('('+pc.[name]+')', '') AS dataSpace,
       STR(ISNULL(NULLIF(ix.fill_factor, 0), 100), 4, 0)+'%' AS [fillFactor],

       --- The raw numbers:
       ps.row_count AS [rows],
       STR(1.0*ps.reserved_page_count*8/1024, 12, 2) AS reserved_MB,
       STR(1.0*ps.in_row_used_page_count*8/1024, 12, 2) AS inRowUsed_MB,
       STR(1.0*ps.row_overflow_used_page_count*8/1024, 12, 2) AS RowOverflowUsed_MB,
       STR(1.0*ps.lob_used_page_count*8/1024, 12, 2) AS outOfRowUsed_MB,
       STR(1.0*ps.used_page_count*8/1024, 12, 2) AS totalUsed_MB

FROM sys.dm_db_partition_stats AS ps
INNER JOIN sys.partitions AS p ON
    ps.[partition_id]=p.[partition_id]
INNER JOIN sys.objects AS obj ON
    ps.[object_id]=obj.[object_id]
INNER JOIN sys.schemas AS sch ON
    obj.[schema_id]=sch.[schema_id]
LEFT JOIN sys.indexes AS ix ON
    ps.[object_id]=ix.[object_id] AND
    ps.index_id=ix.index_id
--- Data space is either a file group or a partition function:
LEFT JOIN sys.data_spaces AS ds ON
    ix.data_space_id=ds.data_space_id
--- This is the partitioning column:
LEFT JOIN sys.index_columns AS ixc ON
    ix.[object_id]=ixc.[object_id] AND
    ix.index_id=ixc.index_id AND
    ixc.partition_ordinal>0
LEFT JOIN sys.columns AS pc ON
    pc.[object_id]=obj.[object_id] AND
    pc.column_id=ixc.column_id

--- Not interested in system tables and internal tables:
WHERE obj.[type] NOT IN ('S', 'IT')

ORDER BY sch.[name], obj.[name], ix.index_id, p.partition_number;