根据段、簇和页分析表占用空间大小

在实际业务中我们经常需要查看表或索引的空间占用大小,以了解实际数据磁盘占用情况。本次从表空间的逻辑结构分析表的空间占用情况,以便更直观的理解表的存储情况。

表空间逻辑图

在理解表的占用大小之前,我们先来理解下表空间和表、段、簇、页的逻辑关系,如下是表空间的逻辑关系图:

可以看出,DM数据库表空间、数据文件、表、段、簇、页的关系如下:

1.数据库由一个或多个表空间组成;

2.每个表空间由一个或多个数据文件组成;

3.每个数据文件由一个或多个簇组成;

4.段是簇的上级逻辑单元,一个段可以跨多个数据文件;

5.簇是数据库申请空间的最小的逻辑单位,是数据页的上级逻辑单元,由16个或32个连续的数据页组成,一个簇总是在一个数据文件中;在DM数据库中,簇的大小由用户在创建数据库时指定,默认大小为16页。一旦创建好数据库,此后该数据库的簇的大小就不能够改变。

6.页是存放数据的最小的逻辑单元,也是数据库中使用的最小的IO单元,页的大小对应物理存储空间上特定数量的存储字节,在DM数据库中,页大小可以为4KB、8KB、16KB或者32KB,用户在创建数据库时可以指定,默认大小为8KB,一旦创建好了数据库,则在该库的整个生命周期内,页大小都不能够改变。

7.创建表时会指定存储的表空间名称,未指定则使用用户默认表空间,如果创建用户时未指定用户默认表空间,则使用MAIN表空间;表数据保存在表空间数据文件中的数据段中。

分析了表和段、簇、页的逻辑关系后,我们来分析下表数据的空间占用情况。在分析表数据的空间占用之前,我们先查询下数据库簇大小和页大小的定义,以了解数据库的基本存储大小。

表/索引占用空间大小分析

01

查看数据库簇大小和页大小

使用DM管理工具登录数据库,在左侧对象导航窗口,右击登录的数据库,选择【管理服务器】,打开管理服务器页面,在系统概览中即可查看数据库的页大小和簇大小。

如下图所示,本次实验环境数据库页大小为8K(8192bytes),簇大小为16页。数据段的分配以簇为单位,最小分配一个簇=16页=16*8K=16*8192bytes=131072字节。

02

查看表/索引空间占用情况

了解了数据的最小分配字节大小后,我们来分析下表的空间占用。可以使用数据字典或系统函数来查看表、索引数据的空间占用情况。

(1)

使用数据字典查看空间占用情况

DBA_SEGMENTS是兼容Oracle部分功能的数据字典视图,使用该视图可以查询数据库中所有段的存储信息。该视图字段说明如下:

使用如下语句查询DMHR用户下表和索引的空间占用情况:

select t.SEGMENT_NAME,t.SEGMENT_TYPE,t.TABLESPACE_NAME,t.BLOCKS,t.EXTENTS,t.BYTES,t.NEXT_EXTENTfrom DBA_SEGMENTS twhere t.OWNER= 'DMHR';

查询结果显示如下,可以看出,表的数据段中初始分配一个簇(EXTENTS),一个簇包含16页(BLOCKS),1个簇大小为131072字节(BYTES),所以表的初始大小为131072字节。

在创建普通表和索引时,可以指定存储参数初始簇数目INITIAL和下次分配簇数目NEXT,两者默认值都是最为1。我们也可以从DBA_SEGMENTS中可以看到此项信息,当表中数据不断增多时,空间的分配以指定的NEXT值来分配簇大小。

(2)

使用系统函数查看空间占用情况

表的空间占用情况查询

使用系统过程TABLE_USED_SPACE获取指定表所占用的页数(注意此函数返回表占用的页数,不是字节大小)。语法参考如下:

INT TABLE_USED_SPACE (schname varchar(256),tabname varchar(256))

参数说明:

schname:模式名,必须大写

tabname:表名,必须大写

返回值:

表所占用的页数

如查看DMHR用户下EMPLOYEE表的占用字节数,使用如下语句(其中,page为数据库页大小,以字节为单位):

SELECT TABLE_USED_SPACE('DMHR', 'EMPLOYEE')*page as table_bytes;

执行结果如下,可以看出此结果与上图DBA_SEGMENTS中查询的BYTES字段结果一致:

索引的空间占用情况查询

我们使用系统过程INDEX_USED_SPACE获取指定索引所占用的页数(注意此函数返回索引占用的页数,不是字节大小)。语法参考如下:

INT INDEX_USED_SPACE (schname varchar(256),indexname varchar(256)

参数说明:

schname:模式名,必须大写

indexname:索引名,必须大写

返回值:

索引占用的页数

如查看DMHR用户下索引INDEX33555467占用字节数,使用如下语句:

SELECT INDEX_USED_SPACE('DMHR', 'INDEX33555467')*page as index_bytes;

执行结果如下,可以看出此结果与上图DBA_SEGMENTS中查询的BYTES字段结果一致:

03

释放表的空间占用

为什么说delete没有释放表空间的占用,我们来演示一下。

使用DMHR用户登录,创建T_EMP表,表结构和数据与EMPLOYEE相同,并循环重复插入EMPLOYEE表中数据。

插入数据后,执行如下语句查询该表的空间占用情况:​​​​​​​

select t.SEGMENT_NAME,t.SEGMENT_TYPE,t.BLOCKS,t.EXTENTS,t.BYTESfrom DBA_SEGMENTS twhere t.OWNER= 'DMHR'andt.SEGMENT_NAME= 'T_EMP';

查询结果如下:

使用delete删除数据,查看表的空间占用情况,可以看出表的空间占用没有释放,如下图:

使用truncate删除表后,再查看表的空间占用情况,可以看出空间占用已释放,如下图。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值