Monday, June 27, 2016

T-SQL: Summary of all tables in a DB

To see a summary of all tables in a DB, similar to the OOTB report:

SELECT  @@Servername AS ServerName ,
        DB_NAME() AS DBName ,
        sub.SchemaName
        ,o.name AS 'TableName'
        --,sub.NumRows
        ,subb.RowCounts
        ,subb.UsedSpaceKB
        ,subb.TotalSpaceKB
        ,sub.type_desc
        ,o.create_date
        ,o.modify_date
FROM    sys.objects o
JOIN (
SELECT  OBJECT_SCHEMA_NAME(p.object_id) AS SchemaName ,
OBJECT_NAME(p.object_id) AS TableName ,
i.Type_Desc ,
i.Name AS IndexUsedForCounts ,
SUM(p.Rows) AS NumRows,
p.object_id as TableID
FROM    sys.partitions p
JOIN sys.indexes i ON i.object_id = p.object_id AND i.index_id = p.index_id
WHERE   i.type_desc IN ( 'CLUSTERED', 'HEAP' ) -- This is key (1 index per table)
AND OBJECT_SCHEMA_NAME(p.object_id) <> 'sys'
GROUP BY p.object_id , i.type_desc , i.Name
--ORDER BY SchemaName , TableName
) sub ON sub.TableName = o.name
INNER JOIN (
SELECT
t.NAME AS TableName,
--s.Name AS SchemaName,
p.rows AS RowCounts,
SUM(a.total_pages) * 8 AS TotalSpaceKB,
SUM(a.used_pages) * 8 AS UsedSpaceKB,
(SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB
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
WHERE t.NAME NOT LIKE 'dt%'
AND t.is_ms_shipped = 0
AND i.OBJECT_ID > 255
GROUP BY t.Name, p.Rows
) subb on subb.TableName = o.name
WHERE   o.Type = 'U' -- User table
ORDER BY
-- o.name
UsedSpaceKB desc

No comments: