【转载】sp_spaceused2,看库里全部表占用的物理空间

本文介绍了一个自定义存储过程sp_spaceused2,用于批量查询SQL Server中所有表的空间使用情况,相较于原生sp_spaceused仅能一次查询单个对象,此存储过程能够更高效地获取整个数据库中所有指定类型对象的空间占用详情。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我常用sp_spaceused来查看表所占的空间大小,可是一次只能看一个对象的。
今天有空写了个sp_spaceused2,可以同时看全部表的空间大小。
use  master
go
EXEC  sp_addmessage  @msgnum   =   55000 @severity   =   16
   
@msgtext   =  N ' Objects of type %s do not have space allocated. '
   
@lang   =   ' us_english ' , @replace   =   ' replace '

EXEC  sp_addmessage  @msgnum   =   55000 @severity   =   16
   
@msgtext   =  N ' 没有为类型 %1! 的对象分配的空间。 '
   
@lang   =   ' 简体中文 ' , @replace   =   ' replace '
go
if   exists  ( select   1   from  sysobjects  where  name  =   ' sp_spaceused2 '   and  type  =   ' P ' )
 
drop   procedure  sp_spaceused2
go
create   procedure  sp_spaceused2 (
 
@type   varchar ( 2 =   ' U ' --  The objects type we want size on.
  @updateusage   varchar ( 5 =  false  --  Param. for specifying that
      --  usage info. should be updated.
)
as
create   table  #spt_space
(
 id  
int   not   null   primary   key ,
 name  sysname,
 rows  
int   null ,
 reserved 
dec ( 15 null ,
 data  
dec ( 15 null ,
 indexp  
dec ( 15 null ,
 unused  
dec ( 15 null
)

--   Check the object type.
if   @type   not   in  ( ' U ' , ' S ' --  no physical data storage.
   begin
   
raiserror ( 55000 , - 1 , - 1 , @type )
   
return  ( 1 )
  
end

--   Check to see if user wants usages updated.

if   @updateusage   is   not   null
 
begin
  
select   @updateusage = lower ( @updateusage )

  
if   @updateusage   not   in  ( ' true ' , ' false ' )
   
begin
    
raiserror ( 15143 , - 1 , - 1 , @updateusage )
    
return ( 1 )
   
end
 
end

if   @updateusage   =   ' true '
 
begin
  
dbcc  updateusage( 0 with  no_infomsgs
  
print   '   '
 
end

set  nocount  on
-- id, name, rows
insert   into  #spt_space (id, name, rows, data)
select  i.id, o.name, i.rows,  0
from  sysindexes i  inner   join  sysobjects o  on  i.id  =  o.id 
where  i.indid  <   2   and  o.type  =   @type

-- reserved
update  #spt_space
set  reserved  =  r.reserved
from  (  select  o.id,  sum (i.reserved)  as  reserved  from  sysindexes i  inner   join  sysobjects o  on  i.id  =  o.id 
 
where  i.indid  in  ( 0 1 255 and  o.type  =   @type   group   by  o.id) r
where  #spt_space.id  =  r.id

-- data
update  #spt_space
set  data  =  data  +  r.pages
from  (  select  o.id,  isnull ( sum (i.dpages), 0 as  pages  from  sysindexes i  inner   join  sysobjects o  on  i.id  =  o.id 
 
where  i.indid  <   2   and  o.type  =   @type   group   by  o.id) r
where  #spt_space.id  =  r.id

update  #spt_space
set  data  =  data  +  r.used
from  (  select  o.id,  isnull ( sum (used),  0 as  used  from  sysindexes i  inner   join  sysobjects o  on  i.id  =  o.id 
 
where  i.indid  =   255   and  o.type  =   @type   group   by  o.id) r
where  #spt_space.id  =  r.id


-- index page
update  #spt_space
set  indexp  =  r.used  -  data
from  (  select  o.id,  sum ( convert ( dec ( 15 ),used))  as  used  from  sysindexes i  inner   join  sysobjects o  on  i.id  =  o.id 
 
where  i.indid  in  ( 0 1 255 and  o.type  =   @type   group   by  o.id) r
where  #spt_space.id  =  r.id

-- unused page
update  #spt_space
set  unused  =  reserved  -  r.used
from  (  select  o.id,  sum ( convert ( dec ( 15 ),used))  as  used  from  sysindexes i  inner   join  sysobjects o  on  i.id  =  o.id 
 
where  i.indid  in  ( 0 1 255 and  o.type  =   @type   group   by  o.id) r
where  #spt_space.id  =  r.id

-- output
  select  #spt_space.name,
  rows 
=   convert ( char ( 11 ), rows),
  reserved 
=   ltrim ( str (reserved  *  d.low  /   1024 ., 15 , 0 +
    
'   '   +   ' KB ' ),
  data 
=   ltrim ( str (data  *  d.low  /   1024 ., 15 , 0 +
    
'   '   +   ' KB ' ),
  index_size 
=   ltrim ( str (indexp  *  d.low  /   1024 ., 15 , 0 +
    
'   '   +   ' KB ' ),
  unused 
=   ltrim ( str (unused  *  d.low  /   1024 ., 15 , 0 +
    
'   '   +   ' KB ' )
 
from  #spt_space, master.dbo.spt_values d
  
where  d. number   =   1
   
and  d.type  =   ' E '

return   0
go


sp_MS_marksystemobject 
' sp_spaceused2 '

go
use   [ dbname ]
exec  sp_spaceused2
出处:http://blog.myspace.cn/1300316663/archive/2007/05/23/249582259.aspx
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值