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

表空间逻辑图

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

可以看出,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删除表后,再查看表的空间占用情况,可以看出空间占用已释放,如下图。

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

  1. oracle查询表占用空,Oracle 表的行数、表占用空间大小,列的非空行数、列占用空间大小 查询...

    --表名,表占用空间大小(MB),行数 select table_name, round(num_rows * avg_row_len /1024/1024, 8) as total_len, num ...

  2. SQL Server查看库、表占用空间大小

    SQL Server查看库.表占用空间大小 - 郭大侠1 - 博客园 (cnblogs.com) https://www.cnblogs.com/gered/p/9009513.html SELECT ...

  3. DB2 查看表占用空间大小

    1.查看数据库页大小 db2 get db cfg 2.收集表状态信息 db2 runstats on table schema.table_name 3.查询数据表占用页的数量 select tab ...

  4. Oracle查看分区、索引、表占用空间大小

    查看用户表.索引.分区表占用空间 select segment_name, sum(bytes)/1024/1024 Mbytese from user_segments group by segme ...

  5. 查看oracle 分区表大小,ORACLE查询每个表占用空间大小的方法

    SELECT 'select sum(bytes) FROM dba_segments WHERE owner ='|| '"TESTBAR"'||' AND segment_ty ...

  6. mysql tables rows_MySQL数据库查看数据表占用空间大小和记录数

    MySQL数据库中每个表占用的空间.表记录的行数的话,可以打开MySQL的 information_schema 数据库.在该库中有一个 TABLES 表,这个表主要字段分别是: TABLE_SCHE ...

  7. MySQL查看表占用空间大小

    需求:我们在选购服务器硬盘时,通常需要先估算一下数据量.比如我们现在做的项目,百万级用户,然后在现有的数据结构中插入一万条数据,然后根据相应的需求去计算出实际生产中的数据量. 前言:在mysql中有一 ...

  8. Hive下查看表占用空间大小的方法

    一.Hive下查看数据表信息的方法 方法1:查看表的字段信息 desc table_name; 方法2:查看表的字段信息及元数据存储路径 desc extended table_name; 方法3:查 ...

  9. 查询mysql数据库表占用空间大小_查看 MySQL 数据库中每个表占用的空间大小-阿里云开发者社区...

    如果想知道MySQL数据库中每个表占用的空间.表记录的行数的话,可以打开MySQL的 information_schema 数据库.在该库中有一个 TABLES 表,这个表主要字段分别是: TABLE ...

最新文章

  1. 基于自然的灵感算法--元启发式
  2. 华为机试第九题python
  3. Android的EditText自动获取焦点并弹出输入法问题
  4. 小程序使用wxParse解析html
  5. VR+监狱,分分钟让犯罪分子重新做人
  6. 计算机网络与综合布线系统设计,【方案】某医院计算机网络综合布线系统设计...
  7. javascript学习总结1
  8. 数据拆分缺点和解决方案
  9. 20151118小问题
  10. 爬虫从入门到放弃——爬虫的基本原理
  11. 微信登录+sdk+服务器,微信sdk后端集成
  12. husky 7 + lint-staged 11+ prettier 2 + eslint 7 配置
  13. DiskGenius清除分区空闲空间后硬盘满了
  14. 操作系统文件管理习题
  15. cadence中测输出功率方法
  16. 外贸人常用的几种客户开发渠道
  17. tarjan BLO
  18. 弹出框PopuoWindow
  19. 定义 范围与核心思想 IT服务管理及其价值
  20. typecho图片水印插件

热门文章

  1. 安卓搜不到airpods_在安卓手机上找回使用 AirPods 的最佳体验:AndPods | App+1
  2. 匪夷所思的未来手机十大用途
  3. [附源码]Python计算机毕业设计古诗词知识学习系统Django(程序+LW)
  4. ps如何认证成为正版
  5. Python做偏自相关图(PACF)报警告
  6. excel一列求和_让excel填写数据后自动填充公式运算的方法
  7. python判断邮箱格式是否正确_【案例】Python - 用正则判断邮箱是否合法
  8. 跨境早报| 亚马逊新站点来了!又一条中国至俄罗斯货运航线将启动?
  9. 我对“开源博客”的设想
  10. 解决webSocket中传输base64图片过大时的过慢问题