数据库占用的存储空间,从高层次来看,可以查看数据库文件(数据文件,日志文件)占用的存储空间,从较细的粒度上来看,分为数据表,索引,分区占用的存储空间。监控数据库对象占用的硬盘空间,包括已分配,未分配,和未使用的空间占比,能够有效地管控存储空间,合理利用,避免部分文件空间不足,而其他文件浪费空间的问题。

一,数据库文件占用的存储空间

1,查看数据库的各个文件占用的存储空间

select db.name as database_name,
db.is_auto_shrink_on,
db.recovery_model_desc,
mf.file_id,
mf.type_desc,
mf.name as logic_file_name,
mf.size*8/1024/1024 as size_gb,
mf.physical_name,
--mf.max_size,
mf.growth,
mf.is_percent_growth,
mf.state_desc
from sys.databases db
inner join sys.master_files mf
on db.database_id=mf.database_id
where mf.size*8/1024/1024>1 -- GB
order by size_gb desc

2,查看数据文件中已分配,未分配和混合区的空间

视图:sys.dm_db_file_space_usage 以Page为单位,实际上,Page的计数都是在区(Extent)级别上统计的,数据文件不够GAM(Global Allocation Map)和SGAM(Shared Global Allocation Map)。

select db_name(mf.database_id) as db_name
,su.file_id
,su.filegroup_id
,mf.name as file_logic_name
,mf.physical_name
,su.total_page_count*8/1024/1024 as total_gb
,su.allocated_extent_page_count*8/1024/1024 as allocated_gb
,su.unallocated_extent_page_count*8/1024/1024 as unallocated_gb
,su.mixed_extent_page_count*8/1024 as mixed_mb
from sys.dm_db_file_space_usage su
inner join sys.master_files mf
on su.database_id=mf.database_id
and su.file_id=mf.file_id

还有一个DBCC命令返回相同的数据,该命令以区(Extent)为单位,统计数据库的文件上已分配的,未分配的区的数量:

 dbcc showfilestats

该命令从系统page:GAM 和 SGAM 上读取Extent的分配信息

3,使用查看当前数据库的空间使用量

exec sys.sp_spaceused

数据库的空间利用信息:

  • database_size数据文件和日志文件的大小;database_size 会比 reserved + unallocated space的加和大,这是因为 reserved 和 unallocated_space 仅仅是数据文件的大小;
  • unallocated space :数据文件中的未分配空间虽然占用文件的硬盘空间,但是,没有分配,不能被其他数据库对象使用;
  • reserved:数据文件中的保留空间,是已经分配的硬盘空间,能够被其他数据库对象使用;
  • data:数据占用的硬盘空间;
  • index_size:索引占用的硬盘空间;
  • unused :已经分配,但是未被使用的硬盘空间;

二,查看数据库中,各个数据表或索引所占用的硬盘空间

1,查看数据库所有数据库表或索引所占用的硬盘空间

;with cte_space as
(
select
ps.object_id
,sum(case when ps.index_id<2 then ps.row_count else 0 end) as row_count
,sum(ps.reserved_page_count)*8/1024/1024 as reserved_gb
,sum(ps.used_page_count)*8/1024/1024 as used_gb
,sum(case when ps.index_id<2
then ps.in_row_data_page_count+ps.lob_used_page_count+ps.row_overflow_used_page_count
else 0 end
)*8/1024/1024 as data_used_gb
from sys.dm_db_partition_stats ps with(nolock)
inner join sys.tables t with(nolock)
on ps.object_id=t.object_id
group by ps.object_id
)
select object_schema_name(s.object_id)+'.'+object_name(s.object_id) as table_name
,s.row_count
,s.reserved_gb
,s.used_gb
,s.data_used_gb
,s.used_gb-s.data_used_gb as index_used_gb
,s.reserved_gb-s.used_gb as unused_gb
from cte_space s
where s.reserved_gb>1 -- more than 512MB
order by used_gb desc
,index_used_gb desc

2,以索引为单位,查看数据表上各个索引占用的硬盘空间

;with cte_space as
(
select
ps.object_id
,ps.index_id
,sum(ps.row_count) as row_count
,sum(ps.reserved_page_count)*8/1024 as reserved_mb
,sum(ps.used_page_count)*8/1024 as used_mb
,sum(ps.in_row_data_page_count+ps.lob_used_page_count+ps.row_overflow_used_page_count)*8/1024 as data_used_mb
,sum(ps.in_row_data_page_count)*8/1024 as in_row_data_used_mb
,sum(ps.lob_used_page_count+ps.row_overflow_used_page_count)*8/1024 as max_data_used_mb
from sys.dm_db_partition_stats ps
inner join sys.tables t
on ps.object_id=t.object_id
group by ps.object_id
,ps.index_id
)
select object_schema_name(s.object_id)+'.'+object_name(s.object_id) as table_name
,i.index_id
,i.name as index_name
,s.row_count
,s.reserved_mb
,s.used_mb
,s.data_used_mb
,s.in_row_data_used_mb
,s.max_data_used_mb
,s.used_mb-s.data_used_mb as index_used_mb
,s.reserved_mb-s.used_mb as unsed_mb
from cte_space s
inner join sys.indexes i
on s.object_id=i.object_id
and s.index_id=i.index_id
where s.reserved_mb>512 -- more than 512MB
--and i.index_id>1
order by unsed_mb desc
,index_used_mb desc

3,在当前DB中,查看某一个数据表的空间使用信息

该存储过程用于查看当前数据库数据表的空间使用,返回的结果并不精确,默认情况下,该存储过程底层使用系统视图 sys.allocation_units 和 sys.partitions 获取数据表的所占用空间的“近似”信息。当索引被删除、索引被重建、或者大表被删除(drop,truncate)时,数据库引擎会延迟Page的释放,延迟删除导致不会立即释放已分配的空间,在这种情况下,该存储过程不会立即返回精确的空间使用信息。

exec sys.sp_spaceused 'dbo.dt_study'

  • rows::数据表的总行数;
  • reserved:数据文件中已分配的空间;
  • data:数据文件中,基础表占用的空间;
  • index_size:数据文件中,索引占用的空间;
  • unused:数据文件中,已分配,但是为被数据库对象(基础表和索引)使用的空间;

三,查看服务器各个逻辑盘符剩余的硬盘空间

Exec master.sys.xp_fixeddrives

四,压缩文件

在SQL Server中,使用 DBCC ShrinkFile命令压缩数据库文件(数据文件和日志文件),或直接把数据库文件清空。除非硬盘空间不足,不要轻易收缩数据库的文件,这会打乱索引的物理顺序,大幅增加的索引外部碎片,影响查询性能。

在执行DBCC ShrinkFile命令,收缩数据文件的时候,数据库引擎首先把文件尾部的区(Extent)移动到文件的开头,然后释放文件末尾的空闲空间,归还给操作系统。在移动Page时,数据库引擎会扫描数据文件并对正在读取的页面加锁,对数据库的性能会有所影响。但是收缩操作不是一个独占行为,其他用户仍然可以对数据库进行读写操作。在进程中的任意一个时间点停止文件收缩操作,任何已经完成的工作都将保留。

收缩文件以区为单位,它会把文件末尾已分配的区前移,把未分配的区从文件末尾移除。该命令不会把一个区里面的空闲页面(empty page)移除,也不会合并区以释放空闲页面,如果数据库中有很多只使用了一两个页面的区,DBCC SHRINKFILE的效果会不明显。

DBCC SHRINKFILE ( { file_name | file_id }, EMPTYFILE )
DBCC SHRINKFILE ( { file_name | file_id }, target_size , { NOTRUNCATE | TRUNCATEONLY } )

1,参数说明

target_size :是整数类型,单位是MB,数据库引擎尝试把文件收缩到指定的大小(Size),但不会收缩到小于数据实际存储必需的空间。只有和参数NOTRUNCATE搭配使用,才起作用。

EMPTYFILE :把数据从指定的文件迁移到同一个文件组中的其他文件中,也就是说,把当前文件清空,把数据转存到其他文件中,数据的迁移只能在同一个文件组的不同文件之间进行。数据文件被清空之后,数据库引擎不会把数据存储到空文件中,可以使用 ALTER DATABASE 把文件从数据库中移除。

NOTRUNCATE:只用于数据文件,对日志文件不起作用;该参数用于把已分配(Allocated)的区(Extent)从数据文件的末尾移动到数据文件开头的未分配(Unallocated)的空间中,文件末尾被释放的空间不会返回给操作系统,仍然存在于文件中,处于未分配状态,这意味着数据库文件占用的存储空间不变。和target_size参数一起使用,用于指定文件收缩的大小。由于区(Extent)的移动是IO密集型操作,会影响数据库的IO性能。

TRUNCATEONLY:把文件末尾的所有空闲空间都释放,返回给操作系统,该参数不会执行任何的Page移动,也就是说,该参数收缩数据库文件,而忽略target_size参数,收缩的硬盘空间以区(Extent)为单位。

2,收缩文件示例

想要收缩数据库文件,释放硬盘空间,需要分两步:先移动,后释放

Step1,将文件末尾已分配的区(extent)向前移动,移动到文件前端未被分配的区中,移动的区被标记为未分配(Unallocated)

dbcc shrinkfile('filename',0,notruncate)

Step2,将文件末尾的空闲空间(以区为单位)释放,归还给操作

dbcc shrinkfile('filename',target_size_MB,truncateonly)

3,清空文件

清空文件,是指把当前文件中的数据转移到同一个FileGroup的其他文件中去,使得当前文件不包含任何数据。

dbcc shrinkfile('filename',emptyfile)

也可以使用emptyfile把数据均匀分布到不同的文件上去。

参考文档:

sp_spaceused

sys.dm_db_file_space_usage (Transact-SQL)

数据库的Disk Space usage的更多相关文章

  1. Disk Space Usage 术语理解:unallocated, unused and reserved

    通过standard reports查看Disk Usage,选中Database,右击,选择Reports->Standard Reports->Disk Space Usage,截图如 ...

  2. 12 Useful “df” Commands to Check Disk Space in Linux

    On the internet you will find plenty of tools for checking disk space utilization in Linux. However, ...

  3. RMAN 备份数据库到DISK后进行数据恢复

    RMAN 备份数据库到DISK,然后进行数据恢复 一.rman备份 1. 全备脚本 vi bakup_level0.sql connect target / run { allocate channe ...

  4. How to get the free disk space in PostgreSQL (PostgreSQL获取磁盘空间)

    Get the current free disk space in PostgreSQL PostgreSQL获取磁盘空间 from eshizhan Here has a simple way t ...

  5. [转]Not enough free disk space on disk '/boot'

    Not enough free disk space on disk '/boot' http://my.oschina.net/u/947673/blog/277224 # 解决 出现此情况是因为你 ...

  6. linux shell 命令学习(1) du- estimate file space usage

    du - estimate file space usage , 计算文件的磁盘大小 语法格式: du [OPTION] ... [FILE] 描述: 汇总每个文件的磁盘大小, 递归汇总目录的大小, ...

  7. 14.10.5 Reclaiming Disk Space with TRUNCATE TABLE 回收空间使用TRUNCATE TABLE

    14.10.5 Reclaiming Disk Space with TRUNCATE TABLE 回收空间使用TRUNCATE TABLE 回收操作系统磁盘空间当truncate 一个InnoDB ...

  8. Android Studio模拟器磁盘空间不足(Not enough disk space to run AVD)

    在Android Studio中运行模拟器时,提示Error: Not enough disk space to run AVD '....'. Exiting.是说安装模拟的磁盘空间不足,导致无法运 ...

  9. Ubuntu --- not enough free disk space

    Ubuntu系统更新时出现not enough free disk space. 原因是系统的就内核占满了/boot 的空间,只要将旧内核删除就ok了 首先,命令 uname -r  查看当前内核,( ...

随机推荐

  1. js中的日期控件My97 DatePicker---那些打酱油的日子

    使用WdatePicker插件来渲染日期类型的页面. 以下代码用到的属性有: isShowClear是否显示清空按钮 skin皮肤的样式 readOnly是否只读 maxDate:最大的选择时间 &l ...

  2. NAIPC-2016

    A. Fancy Antiques 爆搜+剪枝. #include <bits/stdc++.h> using namespace std ; typedef pair < int ...

  3. maven中把依赖的JAR包一起打包

    <buizld> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId ...

  4. WEB应用的组成结构

  5. Android -- PopupWindow(其中嵌套ListView 可以被点击)

    1. 效果图

  6. C#判断数组是否为空

    string[] array=new[] { "1", "2", "3", "4", "5" }; ...

  7. php止刷新页面重复提交

    利用session来解决,首先新建一个session,并赋值,第一次提交后改变session的值,当第二次再此提交此内容时,如果不是我们的赋值,就不在处理传过来的数据.如:<?php sessi ...

  8. 字符串、数组方法实战--charAt(),split(),indexOf(),substring()

    这篇随笔根据两个面试题来实战一下数组.字符串的一些方法. 题一:一个字符串中找出出现次数最多的字符次数 var str = 'fuuhuhuhufaihuhfnkjNKCNIO';
 function ...

  9. MySQL选择合适的数据类型

    一.char和varchar char是固定长度的,查询速度比varchar速度快的多.char的缺点是浪费存储空间. 检索char列时,返回的结果会删除尾部空格,所以程序需要对为空格进行处理. 对于 ...

  10. 在线图片压缩后以ImageIO 流的形式 设置大小显示指定页面

    1.Servlet   代码 public class ZoomImgServlet extends HttpServlet implements Servlet { public void init ...