SQLSERVER中查看表的大小

本文介绍如何使用SQL Server中的sp_spaceused存储过程查询特定表或整个数据库的空间使用情况,并结合sp_MSforeachtable实现对数据库内所有表的空间占用统计。

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

我们在使用SQLSERVER数据库的过程中,通过数据库文件的属性,可以了解某个数据库所有表的数据、索引数据等占的空间,但是有时数据库中某个表所占的具体空间,我们有可能也需要了解,而前面说的这种方法就不能奏效了。SQLSERVER也的确提供了这样的功能,即:sp_spaceused存储过程,它可以方便的为我们统计出任意数据表的大小,其运行结果包括表的记录总数和空间分配、占用情况以及索引数据空间;另外,再结合sp_MSforeachtable这个存储过程,就可以统计一个数据中所有的表格的空间占用信息了。

 

以下是sp_spaceused和sp_MSforeachtable具体的使用示例: 

  1. exec sp_spaceused '表名'            (查询表所占空间) 
  2. exec sp_spaceused '表名', true       (更新表的空间大小,准确的表空大小) 
  3. exec sp_spaceused                    (数据库大小查询) 
  4. exec sp_MSforeachtable "exec sp_spaceused '?'"     (所有用户表空间表小,SQL统计数据,,大量事务操作后可能不准) 
  5. exec sp_MSforeachtable "exec sp_spaceused '?',true"    (所有用户表空间表小,大数据库慎用)

运行sp_spaceused存储过程之后,结果如下图所示:
sql

两个存储过程结合查询任意数据库所有表的空间占用信息示例: 
create table #t(name varchar(255), rows bigint, reserved varchar(20), data varchar(20), index_size varchar(20), unused varchar(20)) 
exec sp_MSforeachtable "insert into #t exec sp_spaceused '?'"  
select * from #t 
drop table #t

示例看完了我们继续深入了解一下这两个存储过程:
参数说明:引用地址
1、sp_spaceused命令规范:

  1. sp_spaceused [[ @objname = ] 'objname' ]  [,[ @updateusage = ] 'updateusage' ]
    1.  

    [ @objname=] 'objname'

    请求其空间使用信息的表、索引视图或队列的限定或非限定名称。仅当指定限定对象名称时,才需要使用引号。如果提供完全限定对象名称(包括数据库名称),则数据库名称必须是当前数据库的名称。如果未指定 objname,则返回整个数据库的结果。

    objname 的数据类型为 nvarchar(776),默认值为 NULL。

    [ @updateusage=] 'updateusage'

    指示应运行 DBCC UPDATEUSAGE 以更新空间使用信息。当未指定 objname 时,将对整个数据库运行该语句;否则,将对 objname 运行该语句。值可以是 truefalseupdateusage 的数据类型为 varchar(5),默认值为 false
    2、sp_MSforeachtable使用说明
    sp_MSforeachtable和sp_MSforeachdb微软提供的两个不公开的存储过程,从ms sql 6.5开始,存放在SQL Server的MASTER数据库中。

      参数说明:
      @command1 nvarchar(2000),          --第一条运行的SQL指令
      @replacechar nchar(1) = N'?',      --指定的占位符号
      @command2 nvarchar(2000)= null,    --第二条运行的SQL指令
      @command3 nvarchar(2000)= null,    --第三条运行的SQL指令
      @whereand nvarchar(2000)= null,    --可选条件来选择表
      @precommand nvarchar(2000)= null,  --执行指令前的操作(类似控件的触发前的操作)
      @postcommand nvarchar(2000)= null  --执行指令后的操作(类似控件的触发后的操作)

      <think>好的,用户想在SQL Server 2008中查看每个大小。我需要先回想一下相关知识。记得在SQL Server中,可以通过系统视图来获取和索引的空间使用情况,比如使用sys.tables和sys.dm_db_partition_stats结合。 首先,用户需要的是每个的行数和占用空间。可能需要编写一个查询,连接多个系统视图,比如sys.tables、sys.indexes和sys.dm_db_partition_stats。可能需要用到SUM函数来统计每个的总页数,然后转换成MB。 然后,记得每个页的大小是8KB,所以总页数乘以8再除以1024可以得到MB。同时,sys.dm_db_partition_stats中的used_page_count包括了数据和索引的页数,所以可能需要用这个字段。 另外,还要考虑是否要包括索引的大小,或者单独显示数据和索引的大小。可能需要将结果按照名分组,并计算每个的总大小。 需要检查语法是否正确,确保在SQL Server 2008中这些系统视图是否存在。比如sys.dm_db_partition_stats在2005及以后版本都有,所以2008应该是支持的。 然后,可能需要提供一个示例查询,让用户可以直接运行。同时,解释每个步骤的作用,比如字段的含义和计算方式。用户可能还需要知道如何执行这个查询,比如在SSMS中新建查询窗口,然后运行。 另外,用户提到的引用[^1]是关于统计大小进行性能优化和容量规划,可以提到这一点,说明查询结果的作用。比如,优化性能或规划存储时,了解各大小很重要。 最后,生成相关问题,可能包括如何优化大、如何清理数据,或者如何自动化这个统计过程。这样用户可以有进一步的学习方向。</think>### 在 SQL Server 2008 中查看大小的步骤 #### 方法一:使用系统视图和动态管理视图 可通过组合系统视图 `sys.tables` 和动态管理视图 `sys.dm_db_partition_stats` 实现: ```sql SELECT t.NAME AS 名, p.rows AS 行数, SUM(a.total_pages) * 8 / 1024 AS 总空间(MB), SUM(a.used_pages) * 8 / 1024 AS 已用空间(MB), (SUM(a.total_pages) - SUM(a.used_pages)) * 8 / 1024 AS 未用空间(MB) FROM sys.tables t INNER JOIN sys.indexes i ON t.object_id = i.object_id INNER JOIN sys.partitions p ON i.object_id = p.object_id AND i.index_id = p.index_id INNER JOIN sys.allocation_units a ON p.partition_id = a.container_id WHERE t.is_ms_shipped = 0 GROUP BY t.Name, p.Rows ORDER BY 总空间(MB) DESC; ``` **说明**: 1. `sys.tables` 存储所有用户信息 2. `sys.dm_db_partition_stats` 提供分区级存储统计 3. 空间计算基于 SQL Server 的 8KB 页大小标准[^1] #### 方法二:存储过程 `sp_spaceused` 针对单个的快速查询: ```sql EXEC sp_spaceused '名'; ``` 查看所有的空间使用: ```sql EXEC sp_msforeachtable 'EXEC sp_spaceused [?]'; ``` #### 方法三:通过 SSMS 图形界面 1. 打开 SQL Server Management Studio 2. 右键点击目标数据库 > 报 > 标准报 3. 选择「按的磁盘使用情况」
      评论
      添加红包

      请填写红包祝福语或标题

      红包个数最小为10个

      红包金额最低5元

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

      抵扣说明:

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

      余额充值