CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  疑难问题

如何查每个表的大小

楼主kfcn()2003-09-03 08:55:49 在 MS-SQL Server / 疑难问题 提问

非常感谢!!  
          SP_SPACEUSED只能查出某个表的大小,我想要的是同时查出所有表的大小,不知该怎样进行? 问题点数:20、回复次数:6Top

1 楼liuyun2003(流云(老老实实做人,认认真真还贷))回复于 2003-09-03 09:13:40 得分 10

if   exists(select   name   from   sysobjects   where   name='spaceused'   and   type='p')  
   
  Drop   procedure   spaceused  
   
  GO  
   
  create   procedure   spaceused    
   
  as  
   
  begin  
   
   
  declare   @id   int   --   The   object   id   of   @objname.  
   
  declare   @type   character(2)   --   The   object   type.  
   
  declare   @pages   int   --   Working   variable   for   size   calc.  
   
  declare   @dbname   sysname  
   
  declare   @dbsize   dec(15,0)  
   
  declare   @logsize   dec(15)  
   
  declare   @bytesperpage   dec(15,0)  
   
  declare   @pagesperMB   dec(15,0)  
   
  declare   @objname   nvarchar(776)   --   The   object   we   want   size   on.  
   
  declare   @updateusage   varchar(5)   --   Param.   for   specifying   that  
   
   
  create   table   #temp1  
   
  (  
   
  tablename   varchar(200)   null,--表名  
   
  rownum   char(11)   null,--行数  
   
  baoliukj   varchar(15)   null,--保留空间  
   
  datausekj   varchar(15)   null,--数据使用空间  
   
  indexkj   varchar(15)   null,--索引使用空间  
   
  nousekj   varchar(15)   null--未用空间  
   
  )  
   
  --select   @objname=''N_dep''   --   usage   info.   should   be   updated.  
   
  select   @updateusage='false'  
   
  /*Create   temp   tables   before   any   DML   to   ensure   dynamic  
   
  **   We   need   to   create   a   temp   table   to   do   the   calculation.  
   
  **   reserved:   sum(reserved)   where   indid   in   (0,   1,   255)  
   
  **   data:   sum(dpages)   where   indid   <   2   +   sum(used)   where   indid   =   255   (text)  
   
  **   indexp:   sum(used)   where   indid   in   (0,   1,   255)   -   data  
   
  **   unused:   sum(reserved)   -   sum(used)   where   indid   in   (0,   1,   255)  
   
  */  
   
  declare   cur_table   cursor   for  
   
  select   name   from   sysobjects   where   type='u'  
   
   
  Open   cur_table  
   
  fetch   next   from   cur_table   into   @objname  
   
   
  While   @@FETCH_STATUS=0  
   
  begin  
   
  create   table   #spt_space  
   
  (  
   
  rows   int   null,  
   
  reserved   dec(15)   null,  
   
  data   dec(15)   null,  
   
  indexp   dec(15)   null,  
   
  unused   dec(15)   null  
   
  )  
   
   
  /*  
   
  **   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  
   
  /*  
   
  **   Check   to   see   that   the   objname   is   local.  
   
  */  
   
  if   @objname   IS   NOT   NULL  
   
  begin  
   
   
  select   @dbname   =   parsename(@objname,   3)  
   
   
  if   @dbname   is   not   null   and   @dbname   <>   db_name()  
   
  begin  
   
  raiserror(15250,-1,-1)  
   
  return   (1)  
   
  end  
   
   
  if   @dbname   is   null  
   
  select   @dbname   =   db_name()  
   
   
  /*  
   
  **   Try   to   find   the   object.  
   
  */  
   
  select   @id   =   null  
   
  select   @id   =   id,   @type   =   xtype  
   
  from   sysobjects  
   
  where   id   =   object_id(@objname)  
   
   
  /*  
   
  **   Does   the   object   exist?  
   
  */  
   
  if   @id   is   null  
   
  begin  
   
  raiserror(15009,-1,-1,@objname,@dbname)  
   
  return   (1)  
   
  end  
   
   
  if   not   exists   (select   *   from   sysindexes  
   
  where   @id   =   id   and   indid   <   2)  
   
   
  if   @type   in   ('P   ','D   ','R   ','TR','C   ','RF')   --data   stored   in   sysprocedures  
   
  begin  
   
  raiserror(15234,-1,-1)  
   
  return   (1)  
   
  end  
   
  else   if   @type   =   'V   '   --   View   =>   no   physical   data   storage.  
   
  begin  
   
  raiserror(15235,-1,-1)  
   
  return   (1)  
   
  end  
   
  else   if   @type   in   ('PK','UQ')   --   no   physical   data   storage.   --?!?!   too   many   similar   messages  
   
  begin  
   
  raiserror(15064,-1,-1)  
   
  return   (1)  
   
  end  
   
  else   if   @type   =   'F   '   --   FK   =>   no   physical   data   storage.  
   
  begin  
   
  raiserror(15275,-1,-1)  
   
  return   (1)  
   
  end  
   
  end  
   
   
  /*  
   
  **   Update   usages   if   user   specified   to   do   so.  
   
  */  
   
   
  if   @updateusage   =   'true'  
   
  begin  
   
  if   @objname   is   null  
   
  dbcc   updateusage(0)   with   no_infomsgs  
   
  else  
   
  dbcc   updateusage(0,@objname)   with   no_infomsgs  
   
  print   ''    
   
  end  
   
   
  set   nocount   on  
   
   
  /*  
   
  **   If   @id   is   null,   then   we   want   summary   data.  
   
  */  
   
  /*   Space   used   calculated   in   the   following   way  
   
  **   @dbsize   =   Pages   used  
   
  **   @bytesperpage   =   d.low   (where   d   =   master.dbo.spt_values)   is  
   
  **   the   #   of   bytes   per   page   when   d.type   =   ''E''   and  
   
  **   d.number   =   1.  
   
  **   Size   =   @dbsize   *   d.low   /   (1048576   (OR   1   MB))  
   
  */  
   
  if   @id   is   null  
   
  begin  
   
  select   @dbsize   =   sum(convert(dec(15),size))  
   
  from   dbo.sysfiles  
   
  where   (status   &   64   =   0)  
   
   
  select   @logsize   =   sum(convert(dec(15),size))  
   
  from   dbo.sysfiles  
   
  where   (status   &   64   <>   0)  
   
   
  select   @bytesperpage   =   low  
   
  from   master.dbo.spt_values  
   
  where   number   =   1  
   
  and   type   =   'E'  
   
  select   @pagesperMB   =   1048576   /   @bytesperpage  
   
   
  select   database_name   =   db_name(),  
   
  database_size   =  
   
  ltrim(str((@dbsize   +   @logsize)   /   @pagesperMB,15,2)   +   'MB'),  
   
  'unallocated   space'   =  
   
  ltrim(str((@dbsize   -  
   
  (select   sum(convert(dec(15),reserved))  
   
  from   sysindexes  
   
  where   indid   in   (0,   1,   255)  
   
  ))   /   @pagesperMB,15,2)+   '   MB')  
   
   
  print   ''  
   
  /*  
   
  **   Now   calculate   the   summary   data.  
   
  **   reserved:   sum(reserved)   where   indid   in   (0,   1,   255)  
   
  */  
   
  insert   into   #spt_space   (reserved)  
   
  select   sum(convert(dec(15),reserved))  
   
  from   sysindexes  
   
  where   indid   in   (0,   1,   255)  
   
   
  /*  
   
  **   data:   sum(dpages)   where   indid   <   2  
   
  **   +   sum(used)   where   indid   =   255   (text)  
   
  */  
   
  select   @pages   =   sum(convert(dec(15),dpages))  
   
  from   sysindexes  
   
  where   indid   <   2  
   
  select   @pages   =   @pages   +   isnull(sum(convert(dec(15),used)),   0)  
   
  from   sysindexes  
   
  where   indid   =   255  
   
  update   #spt_space  
   
  set   data   =   @pages  
   
   
  /*   index:   sum(used)   where   indid   in   (0,   1,   255)   -   data   */  
   
  update   #spt_space  
   
  set   indexp   =   (select   sum(convert(dec(15),used))  
   
  from   sysindexes  
   
  where   indid   in   (0,   1,   255))  
   
  -   data  
   
   
  /*   unused:   sum(reserved)   -   sum(used)   where   indid   in   (0,   1,   255)   */  
   
  update   #spt_space  
   
  set   unused   =   reserved  
   
  -   (select   sum(convert(dec(15),used))  
   
  from   sysindexes  
   
  where   indid   in   (0,   1,   255))  
   
   
  select   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'  
   
  end  
   
   
  /*  
   
  **   We   want   a   particular   object.  
   
  */  
   
  else  
   
  begin  
   
  /*  
   
  **   Now   calculate   the   summary   data.  
   
  **   reserved:   sum(reserved)   where   indid   in   (0,   1,   255)  
   
  */  
   
  insert   into   #spt_space   (reserved)  
   
  select   sum(reserved)  
   
  from   sysindexes  
   
  where   indid   in   (0,   1,   255)  
   
  and   id   =   @id  
   
   
  /*  
   
  **   data:   sum(dpages)   where   indid   <   2  
   
  **   +   sum(used)   where   indid   =   255   (text)  
   
  */  
   
  select   @pages   =   sum(dpages)  
   
  from   sysindexes  
   
  where   indid   <   2  
   
  and   id   =   @id  
   
  select   @pages   =   @pages   +   isnull(sum(used),   0)  
   
  from   sysindexes  
   
  where   indid   =   255  
   
  and   id   =   @id  
   
  update   #spt_space  
   
  set   data   =   @pages  
   
   
  /*   index:   sum(used)   where   indid   in   (0,   1,   255)   -   data   */  
   
  update   #spt_space  
   
  set   indexp   =   (select   sum(used)  
   
  from   sysindexes  
   
  where   indid   in   (0,   1,   255)  
   
  and   id   =   @id)  
   
  -   data  
   
   
  /*   unused:   sum(reserved)   -   sum(used)   where   indid   in   (0,   1,   255)   */  
   
  update   #spt_space  
   
  set   unused   =   reserved  
   
  -   (select   sum(used)  
   
  from   sysindexes  
   
  where   indid   in   (0,   1,   255)  
   
  and   id   =   @id)  
   
  update   #spt_space  
   
  set   rows   =   i.rows  
   
  from   sysindexes   i  
   
  where   i.indid   <   2  
   
  and   i.id   =   @id  
   
  insert   into   #temp1  
   
  select   name   =   object_name(@id),  
   
  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'  
   
  Drop   table   #spt_space  
   
  end  
   
  fetch   next   from   cur_table   into   @objname  
   
  end  
   
  Close   cur_table  
   
  DEALLOCATE   cur_table  
   
  Select   *   from   #temp1   order   by   len(baoliukj)   desc,baoliukj   desc  
   
  Drop   table   #temp1  
   
  return   (0)  
   
  end  
  这个存储过程能查到当前连接的所有表的空间情况。Top

2 楼zarge(鲨去来兮)回复于 2003-09-03 09:19:21 得分 10

exec   sp_MSForeachTable   'sp_spaceused   "?"'Top

3 楼mjhnet(天涯沦落人)回复于 2003-09-03 09:27:03 得分 0

下例报告为   titles   表分配(保留)的空间量、数据使用的空间量、索引使用的空间量以及由数据库对象保留的未用空间量。  
   
  USE   pubs  
  EXEC   sp_spaceused   'titles'  
   
  Top

4 楼kfcn()回复于 2003-09-03 09:29:00 得分 0

两位都正确.谢谢你们.Top

5 楼kfcn()回复于 2003-09-03 09:30:18 得分 0

楼上的你只是一个表.  
  还是要谢谢你.Top

6 楼kfcn()回复于 2003-09-03 09:31:57 得分 0

我怎么给不了分啊.Top

相关问题

  • 求查看表的大小
  • 表的大小和查询的速度
  • 如何查詢數據表的大小
  • 请问怎样获知每个表在数据库中所占的大小?
  • SQL SERVER里怎樣查一個數據表的大小?
  • asp如何查看数据库中表的字段的大小?
  • SQL SERVER怎样查询表空间剩余大小
  • SQL SERVER表空间大小
  • 关于表的大小
  • 注册表大小更改

关键词

  • storage
  • db
  • dbsize
  • pagespermb
  • updateusage
  • objname
  • bytesperpage
  • beginraiserror
  • sysindexeswhere
  • indid

得分解答快速导航

  • 帖主:kfcn
  • liuyun2003
  • zarge

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo