文件的空间使用和IO统计

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

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

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

 

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
    ,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 :已经分配,但是未被使用的硬盘空间;

4, 统计SQL Server 实例中所有数据库的日志文件的硬盘空间使用

dbcc sqlperf(logspace) 返回的结果总是准确的,语句的执行不会增加系统负担

dbcc sqlperf(logspace)

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

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,以索引为单位,查看数据表上各个索引占用的硬盘空间

 

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)

五,IO请求的等待和挂起

数据库引擎记录对数据文件和日志文件的IO操作,缓存到函数:sys.dm_io_virtual_file_stats,对于数据文件,数据的物理读操作更为重要;对于日志文件,数据的读写操作都重要:

  • io_stall_read_ms:等待读操作的时间
  • io_stall_write_ms:等待写操作的时间

如果硬盘繁忙,数据库引擎发送的IO请求,可能会被IO子系统挂起(pending),数据库引擎把pending的IO请求缓存到视图:sys.dm_io_pending_io_requests,

  • io_pending:指定是否有IO请求挂起或完成

1,查看数据库文件的IO和等待IO完成的时间

 

2,查看pending的IO请求

 

参考文档:

sp_spaceused

sys.dm_db_file_space_usage (Transact-SQL)

sys.dm_db_partition_stats (Transact-SQL)

时间: 2024-10-08 09:19:58

文件的空间使用和IO统计的相关文章

Linux服务器文件删除空间未释放的问题

一.问题起源 在Linux系统中,通过rm删除文件将会从文件系统的目录结构上解除链接(unlink),如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件磁盘空间也一直被占用 这样就会导致我们明明删除了文件,但是磁盘空间却未被释放 二.问题分析 1.首先获得一个已经被删除但是仍然被应用程序占用的文件列表 [email protected]:~# lsof|grep deleted init 1 root 10w REG 253,1 283 155958 /var/log/ups

Oracle bigfile 大文件表空间

Database 是由一个或多个被称为表空间(tablespace)的逻辑存储单位构成.表空间内的逻辑存储单位为段(segment),段又可以继续划分为数据扩展(extent).而数据扩展是由一组连续的数据块(datablock)构成. 大文件表空间 在Oracle中用户可以创建大文件表空间(bigfile tablespace).这样Oracle数据库使用的表空间(tablespace)可以由一个单一的大文件构成,而不是若干个小数据文件.这使Oracle可以发挥64位系统的能力,创建.管理超大

新手迷惑:复制文件路径报错java.io.FileNotFoundException

? 被这个问题搞了很久,可能是太基本了,所以很多人都解决不了,自己找了很多网页,都讲得太高深了,解决不了问题.于是乎,自己捯饬了很久,才能清楚这个简单.很简单的问题.还是记录一下,好记性不如烂笔头,方便后来人! ? 问题:复制文件路径报错java.io.FileNotFoundException: (文件名.目录名或卷标语法不正确.) ? 方法就是:复制路径之后,把最前面的空格去掉就是了,加上双引号.. ? ? ? ? ? ? ? ? ? 很基本吧,但是没人告诉你,就有可能自己摸索很久,哎,小问

清除缓存、开启IO统计

SQL性能优化前期准备-清除缓存.开启IO统计 如果需要进行SQl Server下的SQL性能优化,需要准备以下内容: 一.SQL查询分析器设置: 1.开启实际执行计划跟踪. 2.每次执行需优化SQL前,带上清除缓存的设置SQL. 平常在进行SQL Server性能优化时,为了确保真实还原性能问题,我们需要关闭SQL Server自身的执行计划及缓存.可以通过以下设置清除缓存. 1 DBCC DROPCLEANBUFFERS --清除缓冲区 2 DBCC FREEPROCCACHE --删除计划

HDFS小文件物理空间占用验证

项目环境中遇到的小文件较多,起初除了NAMENODE的内存外,还是比较担心文件物理空间的占用.于是就看一下,小文件是如何占用物理空间的: 前提:HDFS块大小为64MB 文件副本总共3份 1.  批量生成小文件(均20M) 2.  记录测试前DFS空间使用情况 目前,DFS空间已经使用50.04GB 3.  向HIVE中LOAD一个文件testaa 4.  再次查看DFS空间使用情况 5. 查看文件testaa所在的块占用的空间情况 Total size可以看出:占用物理空间为20MB 6. 再

oracle创建大文件表空间

大文件表空间是oracle10g以及以后的版本引进的一个新表空间类型,主要用于决解存储大文件不够的问题.与普通表空间不同的是,大文件表空间只能对应唯一一个数据文件或临时文件,而普通表空间则可以最多对应1022个数据文件或临时文件. 虽然大文件表空间只能对应一个数据文件或临时文件,但其对应的文件可达4G数据块大小,而普通表空间对应的文件最大可达4M个数据块大小. 创建大文件表空间 创建大文件表空间需要使用bigfile关键字,而且只能为其指定一个数据文件或临时文件. 与大文件表空间相对应,普通表空

MySQL ibdata1占用空间大 释放MySQL ibdata1文件的空间

MySQL ibdata1占用空间大  释放MySQL ibdata1文件的空间 背景:最近公司一台服务器报警,磁盘空间报警超阀值.  原来mysql数据库数据目录特别大,前一篇文章中介绍的是变更mysql数据文件的目录,此文主要介绍如何把mysql占用的空间释放出来. 说明: mysql有多种存储引擎,比如MyISAM.InnoDB很常用. 如果用的InnoDB, 且使用mysql默认的配置文件,MySQL的数据都会存放在ibdata1文件中,经过一段时间此文件会变的非常大,占用大量磁盘空间.

C/C++程序缩减生成文件的空间 方法汇总

以VS2008为例 1.项目设置:c/c++->优化 配置中,使用最小化优化(/O1).代码大小优优先(/Os) 2.项目设置:代码生成配置中,缓冲区安全检查 设置为否,可以省几K 3.项目设置:高级配置中,省略默认的库名称,可以省几百字节.  (慎用) 4.能用c文件,就不用cpp文件,可以省几K.有的文件里面全是c的也用cpp后缀,会增大编译后文件的空间 5.static变量定义尽量用短字节,能u1就u1,可以省几字节 6.引导库pragma调用改为LoadLibrary方式动态加载,可以省

SQL性能优化前期准备-清除缓存、开启IO统计

如果需要进行SQl Server下的SQL性能优化,需要准备以下内容: 一.SQL查询分析器设置: 1.开启实际执行计划跟踪. 2.每次执行需优化SQL前,带上清除缓存的设置SQL. 平常在进行SQL Server性能优化时,为了确保真实还原性能问题,我们需要关闭SQL Server自身的执行计划及缓存.可以通过以下设置清除缓存. 1 DBCC DROPCLEANBUFFERS --清除缓冲区 2 DBCC FREEPROCCACHE --删除计划高速缓存中的元素 3.开启查询IO读取统计.查询