How to find largest objects in a SQL Server database?

前端 未结 7 1398
说谎
说谎 2020-12-22 15:00

How would I go about finding the largest objects in a SQL Server database? First, by determining which tables (and related indices) are the largest and then determining whi

7条回答
  •  一整个雨季
    2020-12-22 15:20

    @marc_s's answer is very great and I've been using it for few years. However, I noticed that the script misses data in some columnstore indexes and doesn't show complete picture. E.g. when you do SUM(TotalSpace) against the script and compare it with total space database property in Management Studio the numbers don't match in my case (Management Studio shows larger numbers). I modified the script to overcome this issue and extended it a little bit:

    select
        tables.[name] as table_name,
        schemas.[name] as schema_name,
        isnull(db_name(dm_db_index_usage_stats.database_id), 'Unknown') as database_name,
        sum(allocation_units.total_pages) * 8 as total_space_kb,
        cast(round(((sum(allocation_units.total_pages) * 8) / 1024.00), 2) as numeric(36, 2)) as total_space_mb,
        sum(allocation_units.used_pages) * 8 as used_space_kb,
        cast(round(((sum(allocation_units.used_pages) * 8) / 1024.00), 2) as numeric(36, 2)) as used_space_mb,
        (sum(allocation_units.total_pages) - sum(allocation_units.used_pages)) * 8 as unused_space_kb,
        cast(round(((sum(allocation_units.total_pages) - sum(allocation_units.used_pages)) * 8) / 1024.00, 2) as numeric(36, 2)) as unused_space_mb,
        count(distinct indexes.index_id) as indexes_count,
        max(dm_db_partition_stats.row_count) as row_count,
        iif(max(isnull(user_seeks, 0)) = 0 and max(isnull(user_scans, 0)) = 0 and max(isnull(user_lookups, 0)) = 0, 1, 0) as no_reads,
        iif(max(isnull(user_updates, 0)) = 0, 1, 0) as no_writes,
        max(isnull(user_seeks, 0)) as user_seeks,
        max(isnull(user_scans, 0)) as user_scans,
        max(isnull(user_lookups, 0)) as user_lookups,
        max(isnull(user_updates, 0)) as user_updates,
        max(last_user_seek) as last_user_seek,
        max(last_user_scan) as last_user_scan,
        max(last_user_lookup) as last_user_lookup,
        max(last_user_update) as last_user_update,
        max(tables.create_date) as create_date,
        max(tables.modify_date) as modify_date
    from 
        sys.tables
        left join sys.schemas on schemas.schema_id = tables.schema_id
        left join sys.indexes on tables.object_id = indexes.object_id
        left join sys.partitions on indexes.object_id = partitions.object_id and indexes.index_id = partitions.index_id
        left join sys.allocation_units on partitions.partition_id = allocation_units.container_id
        left join sys.dm_db_index_usage_stats on tables.object_id = dm_db_index_usage_stats.object_id and indexes.index_id = dm_db_index_usage_stats.index_id
        left join sys.dm_db_partition_stats on tables.object_id = dm_db_partition_stats.object_id and indexes.index_id = dm_db_partition_stats.index_id
    group by schemas.[name], tables.[name], isnull(db_name(dm_db_index_usage_stats.database_id), 'Unknown')
    order by 5 desc
    

    Hope it will be helpful for someone. This script was tested against large TB-wide databases with hundreds of different tables, indexes and schemas.

提交回复
热议问题