如何知道每個表各占用多少字節?

勉励前行 2008-08-25 06:11:21
數據庫越來越大了,表也很多,已經 > 3G , 我想知道是哪個表占用空間(字節數)最大。
...全文
132 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
fcuandy 2008-08-25
  • 打赏
  • 举报
回复
create table #(name varchar(20),rows int,reserved varchar(100),data varchar(100),index_size varchar(100),unused varchar(100))
EXEC sp_MSforeachtable @command1="insert # exec sp_spaceused '?'"
select * from # order by 1*replace(data,' kb','') desc
drop table #
勉励前行 2008-08-25
  • 打赏
  • 举报
回复
幸好 返回的結果不會出現 1.56 KB 這種有小數的情況,不然轉換還是麻煩了。
勉励前行 2008-08-25
  • 打赏
  • 举报
回复
做字符轉換成數字,有點煩。。。。應該還是可以做的。
create table #aa(name varchar(100),rows int,reserved varchar(200),
data varchar(200),index_size varchar(200),unused varchar(200))
EXEC sp_MSforeachtable @command1="insert into #aa exec sp_spaceused '?'"
select name , rows,
CAST(REPLACE(reserved,' KB' , '000') as int) as reserved ,
CAST(REPLACE(data,' KB' , '000') as int) as data ,
CAST(REPLACE(index_size,' KB' , '000') as int)as index_size ,
CAST(REPLACE(unused,' KB' , '000') as int)as unused
from #aa order by data desc
drop table #aa
liangCK 2008-08-25
  • 打赏
  • 举报
回复
自己动手下就能处理..连这也不动脑?..
勉励前行 2008-08-25
  • 打赏
  • 举报
回复
再看,結果不如意:sp_spaceused 返回的大小是字符,用 KB 表示,不是數值,排序出錯。

可否有好辦法?
等不到来世 2008-08-25
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 PPower 的回复:]
原來要這樣。。。
create table #aa(name varchar(100),rows int,reserved varchar(200),
data varchar(200),index_size varchar(200),unused varchar(200))
EXEC sp_MSforeachtable @command1="insert into #aa exec sp_spaceused '?'"
select * from #aa order by data desc
drop table #aa
[/Quote]

LZ好聪明呀,不错。。
等不到来世 2008-08-25
  • 打赏
  • 举报
回复

create table #aa(name varchar(100),rows int,reserved varchar(200),data varchar(200),index_size varchar(200),unused varchar(200))
declare @table varchar(100)
declare cur cursor local
for select Name
from sysobjects where xtype='u'
open cur
fetch next from cur into @table
while @@FETCH_STATUS = 0
begin
insert into #aa exec sp_spaceused @table
fetch next from cur into @table
end
deallocate cur
select * from #aa order by [name]

勉励前行 2008-08-25
  • 打赏
  • 举报
回复
原來要這樣。。。
create table #aa(name varchar(100),rows int,reserved varchar(200),
data varchar(200),index_size varchar(200),unused varchar(200))
EXEC sp_MSforeachtable @command1="insert into #aa exec sp_spaceused '?'"
select * from #aa order by data desc
drop table #aa

M1CR0S0FT 2008-08-25
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 PPower 的回复:]
9樓的相當於:EXEC sp_MSforeachtable @command1="sp_spaceused '?'"

稍遺憾,未能實現排序。返回的是多個結果集。
如能將結果合在一起並排序就理想了。
[/Quote]
你定义一个表变量或者临时表,然后每执行一次就往里面插入一条记录,最后查询这个临时表
不就是你想要的了么,都已经写成这样了,楼主自己都不动手去试试 ,哎~
等不到来世 2008-08-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 liangCK 的回复:]
错了..
可以用sp_MSforeachTable存储过程.
[/Quote]
恩,研究了一下。

EXEC sp_MSforeachtable @command1="sp_spaceused '?'"

可以得到相同的结果,不同的是内部用游标实现。表太多的时候只好用这个方法。
10楼的方法不错,除了一两处笔误之外。
liangCK 2008-08-25
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 PPower 的回复:]
9樓的相當於:EXEC sp_MSforeachtable @command1="sp_spaceused '?'"

稍遺憾,未能實現排序。返回的是多個結果集。
如能將結果合在一起並排序就理想了。
[/Quote]

那你可以结合系统表..
勉励前行 2008-08-25
  • 打赏
  • 举报
回复
9樓的相當於:EXEC sp_MSforeachtable @command1="sp_spaceused '?'"

稍遺憾,未能實現排序。返回的是多個結果集。
如能將結果合在一起並排序就理想了。
linco001 2008-08-25
  • 打赏
  • 举报
回复
上回我也为这个问题为难,写了一回。刚刚想写还想了半天。就是忘了怎么弄成一张表。

wufeng4552 的表多了就出错了。
linco001 2008-08-25
  • 打赏
  • 举报
回复
create table #aa(name varchar(100),rows int,reserved varchar(200),data varchar(200),index_size varchar(200),unused varchar(200))
declare @table varchar(100)
declare cur cursor local
for select Name
from sysobjects where xtype='u'
open cur
fetch next from cur into @table
while @@FETCH_STATUS = 0
begin
insert into #aa exec sp_spaceused @table
fetch next from cur into @table
end
close data_nei_cursor
deallocate data_nei_cursor
select * from #aa
水族杰纶 2008-08-25
  • 打赏
  • 举报
回复
declare @Name varchar(100)
declare mycursor cursor for select name from sysobjects where xtype='U'
open mycursor
fetch Next from mycursor Into @name
while (@@fetch_status=0)
begin
exec sp_Spaceused @name
fetch next from mycursor into @Name
end
close mycursor
deallocate mycursor
liangCK 2008-08-25
  • 打赏
  • 举报
回复
错了..
可以用sp_MSforeachTable存储过程.
liangCK 2008-08-25
  • 打赏
  • 举报
回复
直接
spaceused
这样就可以.
等不到来世 2008-08-25
  • 打赏
  • 举报
回复

declare @sql nvarchar(max)
set @sql=''
select @sql=@sql + ' exec sp_spaceused '+ [name]+'; ' from sysobjects where xtype=N'U'
exec(@sql)
勉励前行 2008-08-25
  • 打赏
  • 举报
回复
表太多,這操作很痛苦。
勉励前行 2008-08-25
  • 打赏
  • 举报
回复
sp_spaceused 只能一個表一個表地查嗎?,可不可以一次查全部表。。
加载更多回复(3)

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧