·RSS订阅本站
Dev-club通告
·Dev-Club开始提供RSS订阅
·Dev-Club博客开通,现在开通即可获得50兆文件上传空间
[原创] sp_spaceused2    

怡红公子 于 2008-7-23 18:20:36 加贴在 数据库 ←返回版面 按此给该网友发送邮件 按此察看该网友的资料 按此把文章加入收藏夹 按此给作者留言 按此给作者发送即时消息 按此查看作者个人专辑 按此编辑本帖 按此打印本帖 按此打包转发本帖

我常用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'


计算机世界开发者俱乐部 http://dev-club.esnai.com

帖子操作: [回复本贴][引用回复] [报告本贴]
相邻主题  上一主题  

相关帖子

回复本帖
版面: 数据库  ←返回版面  >>


你还没有登录! 第一次发言请去注册
* 用户名: * 密码: 下次自动登录 密码遗忘?
* 校验码: 请在验证码框输入
  Email: 回复请Email通知 如果不填写则取注册Email
* 主题: (还可以输入100字节) 不能正常发言?  
    * 如果你是要向他人求助,请把主题类型设置为“求助” 如何在社区提问?  怎么在帖子里面发布音乐、视频信息?  
  表情:  
   
   
  内容(最多16KB): 签名 设置  发言注意事项↓ ALT+S发送
   

  上传附件:  
    允许的文件类型:JPG,GIF,ZIP,RAR,最大不能超过2048KB)
图片缩小的工具,如果您上传的JPEG图片比较大,建议您使用这个工具作尺寸调整
 
  链接地址:  
  链接标题:  
  链接图片:  

注意: 在计算机世界开发者俱乐部发言之前您必须仔细阅读并同意下列条款:
·尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法规
·严禁发表危害国家安全、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的作品
·承担一切因您的行为而直接或间接导致的民事或刑事法律责任
·计算机世界开发者俱乐部各栏目的版主有权保留或删除其管辖论坛中的任意内容
·您在计算机世界开发者俱乐部发表的作品,计算机世界开发者俱乐部有权在网站内免费转载或引用
发言注意事项:
·带有*号的内容为必填内容
·只有本版版主或积分大于50的人才可以帖图哦!
·怎样使用ABC代码

Dev-club通告
·Dev-Club开始提供RSS订阅
·Dev-Club博客开通,现在开通即可获得50兆文件上传空间