Table and Index size in SQL Server

前端 未结 9 1182
-上瘾入骨i
-上瘾入骨i 2020-12-04 05:41

Can we have a SQL query which will basically help in viewing table and index sizes in SQl Server.

How SQL server maintains memory usage for tables/indexes?

相关标签:
9条回答
  • 2020-12-04 06:06

    it’s being a long time since the creation for this post but I wanted to share my script:

    WITH CteIndex
    AS
    (
    SELECT 
         reservedpages = (reserved_page_count)
         ,usedpages = (used_page_count)
         ,pages = (
                CASE
                    WHEN (s.index_id < 2) THEN (in_row_data_page_count + lob_used_page_count + row_overflow_used_page_count)
                    ELSE lob_used_page_count + row_overflow_used_page_count
                END
                )    
         ,s.object_id   
         ,i.index_id        
         ,i.type_desc AS IndexType
         ,i.name AS indexname
        FROM sys.dm_db_partition_stats s
        INNER JOIN sys.indexes i ON s.[object_id] = i.[object_id] AND s.index_id = i.index_id   
    )
    SELECT DISTINCT
    DB_NAME(DB_ID()) AS DatabaseName
    ,o.name AS TableName
    ,o.object_id
    ,ct.indexname
    ,ct.IndexType
    ,ct.index_id
    , IndexSpace = LTRIM (STR ((CASE WHEN usedpages > pages THEN CASE WHEN ct.index_id < 2 THEN  pages ELSE (usedpages - pages) END ELSE 0 END) * 8, 15, 0) + ' KB')
    FROM CteIndex ct
    INNER JOIN sys.objects o ON o.object_id = ct.object_id
    INNER JOIN sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL , NULL) ps ON ps.object_id = o.object_id
    AND ps.index_id = ct.index_id
    ORDER BY name ASC
    

    it works for :

    • SQL Server (starting with 2008)
    • Includes info for all tables per current database
    0 讨论(0)
  • 2020-12-04 06:08

    There is an extended stored procedure sp_spaceused that gets this information out. It's fairly convoluted to do it from the data dictionary, but This link fans out to a script that does it. This stackoverflow question has some fan-out to information on the underlying data structures that you can use to construct estimates of table and index sizes for capcity planning.

    0 讨论(0)
  • 2020-12-04 06:15

    This query comes from two other answers:

    Get size of all tables in database

    How to find largest objects in a SQL Server database?

    , but I enhanced this to be universal. It uses sys.objects dictionary:

    SELECT 
        s.NAME as SCHEMA_NAME,
        t.NAME AS OBJ_NAME,
        t.type_desc as OBJ_TYPE,
        i.name as indexName,
        sum(p.rows) as RowCounts,
        sum(a.total_pages) as TotalPages, 
        sum(a.used_pages) as UsedPages, 
        sum(a.data_pages) as DataPages,
        (sum(a.total_pages) * 8) / 1024 as TotalSpaceMB, 
        (sum(a.used_pages) * 8) / 1024 as UsedSpaceMB, 
        (sum(a.data_pages) * 8) / 1024 as DataSpaceMB
    FROM 
        sys.objects t
    INNER JOIN
        sys.schemas s ON t.SCHEMA_ID = s.SCHEMA_ID 
    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
    WHERE 
        t.NAME NOT LIKE 'dt%' AND
        i.OBJECT_ID > 255 AND   
        i.index_id <= 1
    GROUP BY 
        s.NAME, t.NAME, t.type_desc, i.object_id, i.index_id, i.name 
    ORDER BY
        sum(a.total_pages) DESC
    ;
    
    0 讨论(0)
提交回复
热议问题