根据段、簇和页分析表占用空间大小
在实际业务中我们经常需要查看表或索引的空间占用大小,以了解实际数据磁盘占用情况。本次从表空间的逻辑结构分析表的空间占用情况,以便更直观的理解表的存储情况。
表空间逻辑图
在理解表的占用大小之前,我们先来理解下表空间和表、段、簇、页的逻辑关系,如下是表空间的逻辑关系图:
可以看出,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删除表后,再查看表的空间占用情况,可以看出空间占用已释放,如下图。
根据段、簇和页分析表占用空间大小相关推荐
- oracle查询表占用空,Oracle 表的行数、表占用空间大小,列的非空行数、列占用空间大小 查询...
--表名,表占用空间大小(MB),行数 select table_name, round(num_rows * avg_row_len /1024/1024, 8) as total_len, num ...
- SQL Server查看库、表占用空间大小
SQL Server查看库.表占用空间大小 - 郭大侠1 - 博客园 (cnblogs.com) https://www.cnblogs.com/gered/p/9009513.html SELECT ...
- DB2 查看表占用空间大小
1.查看数据库页大小 db2 get db cfg 2.收集表状态信息 db2 runstats on table schema.table_name 3.查询数据表占用页的数量 select tab ...
- Oracle查看分区、索引、表占用空间大小
查看用户表.索引.分区表占用空间 select segment_name, sum(bytes)/1024/1024 Mbytese from user_segments group by segme ...
- 查看oracle 分区表大小,ORACLE查询每个表占用空间大小的方法
SELECT 'select sum(bytes) FROM dba_segments WHERE owner ='|| '"TESTBAR"'||' AND segment_ty ...
- mysql tables rows_MySQL数据库查看数据表占用空间大小和记录数
MySQL数据库中每个表占用的空间.表记录的行数的话,可以打开MySQL的 information_schema 数据库.在该库中有一个 TABLES 表,这个表主要字段分别是: TABLE_SCHE ...
- MySQL查看表占用空间大小
需求:我们在选购服务器硬盘时,通常需要先估算一下数据量.比如我们现在做的项目,百万级用户,然后在现有的数据结构中插入一万条数据,然后根据相应的需求去计算出实际生产中的数据量. 前言:在mysql中有一 ...
- Hive下查看表占用空间大小的方法
一.Hive下查看数据表信息的方法 方法1:查看表的字段信息 desc table_name; 方法2:查看表的字段信息及元数据存储路径 desc extended table_name; 方法3:查 ...
- 查询mysql数据库表占用空间大小_查看 MySQL 数据库中每个表占用的空间大小-阿里云开发者社区...
如果想知道MySQL数据库中每个表占用的空间.表记录的行数的话,可以打开MySQL的 information_schema 数据库.在该库中有一个 TABLES 表,这个表主要字段分别是: TABLE ...
最新文章
- 基于自然的灵感算法--元启发式
- 华为机试第九题python
- Android的EditText自动获取焦点并弹出输入法问题
- 小程序使用wxParse解析html
- VR+监狱,分分钟让犯罪分子重新做人
- 计算机网络与综合布线系统设计,【方案】某医院计算机网络综合布线系统设计...
- javascript学习总结1
- 数据拆分缺点和解决方案
- 20151118小问题
- 爬虫从入门到放弃——爬虫的基本原理
- 微信登录+sdk+服务器,微信sdk后端集成
- husky 7 + lint-staged 11+ prettier 2 + eslint 7 配置
- DiskGenius清除分区空闲空间后硬盘满了
- 操作系统文件管理习题
- cadence中测输出功率方法
- 外贸人常用的几种客户开发渠道
- tarjan BLO
- 弹出框PopuoWindow
- 定义 范围与核心思想 IT服务管理及其价值
- typecho图片水印插件
热门文章
- 安卓搜不到airpods_在安卓手机上找回使用 AirPods 的最佳体验:AndPods | App+1
- 匪夷所思的未来手机十大用途
- [附源码]Python计算机毕业设计古诗词知识学习系统Django(程序+LW)
- ps如何认证成为正版
- Python做偏自相关图(PACF)报警告
- excel一列求和_让excel填写数据后自动填充公式运算的方法
- python判断邮箱格式是否正确_【案例】Python - 用正则判断邮箱是否合法
- 跨境早报| 亚马逊新站点来了!又一条中国至俄罗斯货运航线将启动?
- 我对“开源博客”的设想
- 解决webSocket中传输base64图片过大时的过慢问题