如何使用磁盘空间使用情况检索数据库中所有表的结果集

Sco*_*ott 6 sql t-sql sql-server

是否有可以针对数据库运行的T-SQL查询,该数据库将提供该数据库中所有表的列表以及它们当前的磁盘空间使用情况?我知道我可以使用"属性"对话框在SSMS中查看它,我知道如何使用sp_spaceused sproc一次看一个表,但我想评估所有表的磁盘空间使用情况,以最高磁盘空间使用率排序到最低.我们需要大幅降低数据库大小,因此我希望看到哪些表是最严重的违规者.

Joe*_*lli 11

create table #Temp (
    name nvarchar(128),
    [rows] char(11),
    reserved varchar(18),
    data varchar(18),
    index_size varchar(18),
    unused varchar(18)
)

insert into #Temp
    exec sp_msforeachtable 'sp_spaceused ''?'''

select * from #Temp order by cast(replace(reserved,' kb','') as int) desc
Run Code Online (Sandbox Code Playgroud)

  • 查看proc定义,它从`sys.dm_db_partition_stats`中的`row_count`列中提取.我想我记得以前看过这个,它包含由未提交的事务更改的行. (3认同)

Rem*_*anu 5

sys.allocation_units,看看total_pages.每个行集(索引的分区)有3个分配单元(DATA,SLOB和LOB),请参见表和索引组织.加入sys.partitions以获取object_id和index_id.Index_id 0是无序表的堆,索引id 1是聚簇索引.每个表(索引)至少有一个分区,如果没有分区:

select object_name(p.object_id) as [name],
    object_schema_name(p.object_id) as [schema],
    i.name as [index],
    i.type_desc,
    au.type_desc,
    p.partition_number,
    p.rows,
    au.total_pages * 8 as [space (kb)]
from sys.allocation_units au
join sys.partitions p on au.container_id = p.partition_id
join sys.indexes i on p.object_id = i. object_id
    and i.index_id = p.index_id
order by [space (kb)] desc;
Run Code Online (Sandbox Code Playgroud)