How can you tell what Tables are taking up the most space in a SQL Server 2005 Database?

后端 未结 4 1646
无人共我
无人共我 2020-12-12 11:38

How can you tell what Tables are taking up the most space in a SQL Server 2005 Database?

I am sure there is some System Stored Procedure that shows this information.<

4条回答
  •  一个人的身影
    2020-12-12 12:08

    Thanks to @marc_s for the answer. I needed to know data vs index space so I went ahead and expanded on the query to include that.

    SELECT TableName
        , SUM(DataRowCounts) AS DataRowCounts
        , SUM(DataTotalSpaceGB) AS DataTotalSpaceGB
        , SUM(DataSpaceUsedGB) AS DataSpaceUsedGB
        , SUM(DataUnusedSpaceGB) AS DataUnusedSpaceGB
        , SUM(IndexRowCounts) AS IndexRowCounts
        , SUM(IndexTotalSpaceGB) AS IndexTotalSpaceGB
        , SUM(IndexSpaceUsedGB) AS IndexSpaceUsedGB
        , SUM(IndexUnusedSpaceGB) AS IndexUnusedSpaceGB
        , SUM(DataTotalSpaceGB) + SUM(IndexTotalSpaceGB) AS TotalSpaceGB
    FROM
    (
    SELECT t.NAME AS TableName
        , i.type_desc AS IndexType
        , CASE WHEN i.type_desc IN ('CLUSTERED', 'CLUSTERED COLUMNSTORE', 'HEAP') THEN CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2)/1000 AS NUMERIC(36, 2)) ELSE 0 END AS DataTotalSpaceGB
        , CASE WHEN i.type_desc IN ('CLUSTERED', 'CLUSTERED COLUMNSTORE', 'HEAP') THEN CAST(ROUND(((SUM(a.used_pages) * 8) / 1024.00), 2)/1000 AS NUMERIC(36, 2))  ELSE 0 END AS DataSpaceUsedGB    
        , CASE WHEN i.type_desc IN ('CLUSTERED', 'CLUSTERED COLUMNSTORE', 'HEAP') THEN CAST(ROUND(((SUM(a.total_pages) - SUM(a.used_pages)) * 8) / 1024.00, 2)/1000 AS NUMERIC(36, 2)) ELSE 0 END AS DataUnusedSpaceGB
        , CASE WHEN i.type_desc IN ('CLUSTERED', 'CLUSTERED COLUMNSTORE', 'HEAP') THEN SUM(p.Rows) ELSE 0 END AS DataRowCounts
        , CASE WHEN i.type_desc = 'NONCLUSTERED' THEN CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2)/1000 AS NUMERIC(36, 2)) ELSE 0 END AS IndexTotalSpaceGB
        , CASE WHEN i.type_desc = 'NONCLUSTERED' THEN CAST(ROUND(((SUM(a.used_pages) * 8) / 1024.00), 2)/1000 AS NUMERIC(36, 2))  ELSE 0 END AS IndexSpaceUsedGB    
        , CASE WHEN i.type_desc = 'NONCLUSTERED' THEN CAST(ROUND(((SUM(a.total_pages) - SUM(a.used_pages)) * 8) / 1024.00, 2)/1000 AS NUMERIC(36, 2)) ELSE 0 END AS IndexUnusedSpaceGB  
        , CASE WHEN i.type_desc = 'NONCLUSTERED' THEN SUM(p.Rows) ELSE 0 END AS IndexRowCounts
    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 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
        AND s.Name = 'dbo' --update this filter
        AND t.Name = 'MyTable'
    GROUP BY t.Name
        , i.type_desc
    ) x
    GROUP BY TableName
    ORDER BY TotalSpaceGB DESC
    

提交回复
热议问题