当前位置:  数据库>oracle

简单分析Oracle的数据存储

    来源: 互联网  发布时间:2017-06-09

    本文导语: 在数据库的存储结构中,我们知道一般来说一个表都存储在对应的数据文件里,数据文件可以分为多个段,一般来说一个表会对应一个数据段,单纯考虑数据段的时候,数据段又可以分为多个区,每个区都可以分为若干个数据块,...

在数据库的存储结构中,我们知道一般来说一个表都存储在对应的数据文件里,数据文件可以分为多个段,一般来说一个表会对应一个数据段,单纯考虑数据段的时候,数据段又可以分为多个区,每个区都可以分为若干个数据块,在操作系统层面,有对应的数据块和数据库层面的数据块有一个映射,可以打个比方来说,一栋大楼里面可以有很多的楼层,每个楼层可能都有不同的公司,这样来考虑,这栋大楼就类似数据文件,楼的每一层就类似一个数据段,每一层比方最多可以有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 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来做底层的分析。

在CentOS 6.4下安装Oracle 11gR2(x64)

Oracle 11gR2 在VMWare虚拟机中安装步骤

Debian 下 安装 Oracle 11g XE R2


    
 
 

您可能感兴趣的文章:

  • 开源分析数据存储系统 Druid_Analytics
  • 实例学习mssql存储过程分析
  • 存储过程优缺点分析
  • 基于Mysql存储引擎的深入分析
  • 基于mysql事务、视图、存储过程、触发器的应用分析
  • SQL Server 2005 创建简单的存储过程--总结分析
  • PHP源码分析之变量的存储过程分解
  • 浅谈MySQL存储引擎选择 InnoDB与MyISAM的优缺点分析
  • MySQL数据库存储引擎和分支现状分析
  • Oracle的回滚段存储内容分析
  • 可视化数据分析 ParaView
  • 显微镜数据分析 Gwyddion
  • 大规模数据分析平台 Pig
  • 网络数据采集分析工具 TCPDUMP
  • 非线性拟合和数据分析工具 Fityk
  • 分析型数据库 InfiniDB
  • 强人,linux下驱动相关数据结构和usb设备数据结构之间的功能分析
  • 科学数据分析框架 jHepWork
  • 可视化数据分析程序 SciDAVis
  • 多维数据分析 Madagascar
  • 实验室数据管理分析系统 LabKey Server
  • MongoDB数据模型分析脚本 Variety
  • 流数据分析集群 beatles
  • Java 网络数据分析包 JNetStream
  • 实时数据分析仪表盘框架 FnordMetric
  • 数据收集和分析工具 ODESSA
  • 数据集成、处理分析和勘探平台 KNIME
  • SQLServer中master数据库分析
  • Oracle中关数据库对象的统计分析
  • 基于MongoDB的数据分析工具 Cube
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • HASH查找的程序实现及性能分析
  • 如何获取shell词法分析,语法分析及解释器的内容和信息
  • http协议介绍,文件上传分析及程序举例
  • 两台机器同时出现同样的故障,有人能帮分析分析吗?
  • linux下free命令显示的内存使用情况分析
  • 请教高手帮我分析分析!
  • Linux下时钟同步问题:Clock skew detected原因分析及解决方法
  • 我想编程分析任意一个java文件,把其中的注释部分删掉,请帮我分析一下思路和方法好吗?
  • Docker支持更深入的容器日志分析
  • 如何分析linux宕机原因(或者说如何通过查日志分析宕机原因)
  • mongodb的优点和缺点详细分析
  • Python的词法分析与语法分析
  • Docker容器分析----好处和缺点介绍
  • 大家帮我分析分析:Samba的配置问题
  • docker源码分析之容器日志处理与log-driver实现
  • ubuntu 下安装libpcap 的时候make时候出错 请帮忙分析分析
  • c/c++服务器程序内存泄露问题分析及解决
  • 200分求教有关linux核心的dos攻击算法分析以及源代码的情景分析,研究用,急!!!
  • spring的事务类型及spring和hibernate可能导致的问题分析
  • Java 代码分析工具 JHawk
  • Mysql大表查询优化技巧总结及案例分析
  • 复杂网络分析平台 Gephi


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,