简单分析oracle的数据存储(r2笔记89天)
在数据库的存储结构中,我们知道一般来说一个表都存储在对应的数据文件里,数据文件可以分为多个段,一般来说一个表会对应一个数据段,单纯考虑数据段的时候,数据段又可以分为多个区,每个区都可以分为若干个数据块,在操作系统层面,有对于的数据块映射和数据库层面的数据块有一个映射,可以打个比方来说,一栋大楼里面可以有很多的楼层,每个楼层可能都有不同的公司,这样来考虑,这栋大楼就类似数据文件,楼的每一层就类似一个数据段,每一层比方最多可以有4家公司,一家公司有40个人,有的公司大一点,占用两层,那么就是8个区,320个数据块,有的公司小一点,就占用一层里面的一块,那么这个公司就类似一个较小的数据段,占用1个区,包含40个数据块。 从存储层面来说,目前数据库中只能够查询到区这一级别的信息了。 在user_extents中只能够查看到最基本的区的信息,user_segment里面可以得到一个大体的信息
SQL> desc user_extents
Name Null? Type
----------------------------------------- -------- ----------------------------
SEGMENT_NAME VARCHAR2(81)
PARTITION_NAME VARCHAR2(30)
SEGMENT_TYPE VARCHAR2(18)
TABLESPACE_NAME VARCHAR2(30)
EXTENT_ID NUMBER
BYTES NUMBER
BLOCKS NUMBER
SQL> select extent_id,blocks from user_extents where segment_name='DATA';
EXTENT_ID BLOCKS
---------- ----------
0 8
1 8
2 8
3 8
4 8
5 8
SQL> select extents,blocks from user_segments where segment_name='DATA';
EXTENTS BLOCKS
---------- ----------
6 48
如果想查看每个区中包含哪些数据块,就无能为力了。这个时候dba_extents可以作为一个补充。可以看到哪些区包含哪些数据块。
SQL> select block_id,extent_id,BLOCKS from dba_extents where owner='N1' and segment_name='DATA';
BLOCK_ID EXTENT_ID BLOCKS
---------- ---------- ----------
12800 0 8
12808 5 8
3600 4 8
5224 3 8
12672 2 8
12672 1 8
当然了这个也不能让热满意,有时候想看看一些记录大概占有多大的空间,就可以使用rowid来辅助了。 目前我们得到表data的数据类型如下:
DATA_LENGTH DATA_TYPE
----------- ------------------------------
10 VARCHAR2
22 NUMBER
22 NUMBER
22 NUMBER
22 NUMBER
22 NUMBER
22 NUMBER
22 NUMBER
22 NUMBER
22 NUMBER
SQL> select sum(data_length) from user_tab_cols where table_name='DATA';
SUM(DATA_LENGTH)
----------------
208
那么这些数据类型的数据占用的空间是否是按照最大字节208来存储的呢,换句话说就是表里存放着一条记录,可能长度只有number(2),但是是否会依旧占用22个字节来存储呢。 我们随机抽取一个数据块来简单的测试一下。 可以看到如下两条记录是从0开始计数的,都在12803这个数据块中
select dbms_rowid.ROWID_OBJECT(rowid) object_id,
dbms_rowid.ROWID_RELATIVE_FNO(rowid) file_no,
dbms_rowid.rowid_row_number(rowid) row_no,
dbms_rowid.rowid_block_number(rowid) blk_number
from data where rownum<3;
OBJECT_ID FILE_NO ROW_NO BLK_NUMBER
---------- ---------- ---------- ----------
18993 11 0 12803
18993 11 1 12803
我们来进一步查看12803这个数据块中含有哪些记录。不考虑数据块的其他存储参数。按照默认的值来看。
里面含有约148条记录。
OBJECT_ID FILE_NO ROW_NO BLK_NUMBER
---------- ---------- ---------- ----------
。。。。。。
18993 11 143 12803
18993 11 144 12803
18993 11 145 12803
18993 11 146 12803
18993 11 147 12803
148 rows selected.
可以得到每条记录的平均大小就是55字节。
SQL> select 1024*8/148 from dual;
1024*8/148
----------
55.3513514
另外需要注意的是,这个rownum,block number可以给予不同的数据文件有不同的含义。
同样一个表中的记录在数据文件5中是数据块12676,在7号数据文件是也含有数据块为12767的。而且对应的数据行数也是重新从0开始计算。
OBJECT_ID FILE_NO ROW_NO BLK_NUMBER
---------- ---------- ---------- ----------
18993 5 143 12676
18993 5 144 12676
18993 5 145 12676
18993 5 146 12676
18993 5 147 12676
18993 5 148 12676
18993 7 0 12676
18993 7 1 12676
18993 7 2 12676
18993 7 3 12676
18993 7 4 12676
从上面的小测试可以简单得出:
数据类型的存储是有一定的收缩性的,比如数据类型为number(22),最大支持22位,但是它实际存储的时候会按照实际的存储数据进行分配
另外一个数据段可以存储在多个数据文件中,数据块号为12676在不同的数据文件中有不同的含义,对应的row_number也有不同的意义。
我们可以从user_extents中查看对应的区段信息,可以从dba_extents中得到更多的信息,但是更深入的分析,可以借助rowid来查看,在情况允许的时候,甚至可以导出对应的数据块dump来做底层的分析。
- QBC查询
- 一条delete语句的调优(r4笔记第86天)
- Java支付宝接口开发【面试+工作】
- 03.SVN检出/解决冲突/提交
- Spring思维导图,让Spring不再难懂(mvc篇)
- SQL优化一(SQL使用技巧)
- Spring思维导图,让Spring不再难懂(aop篇)
- MongoDB初探第二篇 (r4笔记第82天)
- Spring思维导图,让Spring不再难懂(cache篇)
- 曲折的10g,11g中EM的安装配置过程(r4笔记第98天)
- Linux 学习记录 一(安装、基本文件操作).
- 实用的位运算应用(r4笔记第97天)
- 关于date格式的两个案例(r4笔记第96天)
- 【新技术分享】C++17 最新进展
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法