简单分析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来做底层的分析。

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2014-09-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java Web

SpringBoot技术栈搭建个人博客【项目准备】

54640
来自专栏测试开发架构之路

MySQL/Oracle视图的创建与使用

视图是一个虚拟的表,是一个表中的数据经过某种筛选后的显示方式,视图由一个预定义的查询select语句组成。

12730
来自专栏乐沙弥的世界

MySQL数据库锁机制

版权声明:本文为博主原创文章,欢迎扩散,扩散请务必注明出处。 https://blog.csdn.net/robinson_0612/art...

24520
来自专栏恰童鞋骚年

SQL Server为啥使用了这么多内存?

原文地址:http://support.microsoft.com/gp/anxin_techtip6/zh-cn

20610
来自专栏学习有记

SQL Server索引简介:SQL Server索引进阶 Level 1

17840
来自专栏FreeBuf

企业安全建设之路:端口扫描(下)

0x00、前言 在企业安全建设过程当中,我们也不断在思考,做一个什么样的端口扫描才能企业业务需求。同时,伴随着企业私有云、混合云以及公有云业务部署环境的不断变...

541100
来自专栏Java Web

SpringBoot技术栈搭建个人博客【项目准备】

总体目标:设计一套自适应/简洁/美观/易于文章管理发布的一个属于我个人的博客,最后一页能展示我个人的简历,因为大三快结束了马上就该去找工作了...哦忘了,最重要...

50580
来自专栏Java架构沉思录

MySQL在并发场景下的优化手段

对于数据库系统来说在多用户并发条件下提高并发性的同时又要保证数据的一致性一直是数据库系统追求的目标,既要满足大量并发访问的需求又必须保证在此条件下数据的安全,为...

16620
来自专栏张戈的专栏

DIY网站统计:WordPress排除管理员评论及精准友链数的方法

今天关注了一下网站统计,发现留言 1600+,想想肯定是把我自己的留言也算进去了,感觉太水了,不真实!另外友链数目也不对,明显是把所有链接都加进去了! ? 于是...

34730
来自专栏数据和云

以12c Identity类型示范自我探索式学习方法

作者简介: ? Oracle ACE总监,ACOUG联合创始人,云和恩墨的联合创始人,致力于通过不断的技术探索,帮助中国用户理解和接触新技术,推广数据库技术应...

43140

扫码关注云+社区

领取腾讯云代金券