暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

达梦大数据 2020-06-05
1159

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


本章内容已在如下环境上测试:

操作系统:中标麒麟7

数据库版本:达梦8

相关关键字:DM8,表占用空间大小,段(Segment),簇(extent),页(block)






表空间逻辑图





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




可以看出,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_EXTENT
    from DBA_SEGMENTS t
    where 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.BYTES
              from DBA_SEGMENTS t
              where t.OWNER= 'DMHR'andt.SEGMENT_NAME= 'T_EMP';

              查询结果如下:





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





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






              好了,本次分享到此结束,希望大家理解DM数据库的页、簇、段的概念,从而理解表的空间占用情况,感谢大家。


              往期精彩回顾
              干货分享|DMRMAN脱机备份常见错误
              干货分享|DM数据库获取表结构和对象定义方法
              干货分享 | Linux下实现disql命令上下翻动



              最后修改时间:2020-06-12 17:36:34
              文章转载自达梦大数据,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论