• oracle中的rowid和数据行的结构


    在oracle数据库系统中每一行都有一个rowid,oracle数据库系统就是利用rowid来定位数据行的。rowid也是oracle中内置的一个标量数据类型

    rowid有一下特点;

      是数据库中每一行的唯一标识

      并不是显示的存储某一列的值

      可以用来定位行,虽然没有直接给出行的物理地址

      提供了访问一张表中数据行的最快机制

    1)rowid有两种类型:限制rowid和扩展rowid

      一、扩展rowid

      扩展rowid是oracle8i之后的版本中引入的,其结构如下:

      数据对象号+相对文件号+块号+行号

    存储(32bit) (10bit)(22bit)(16bit)=10B

    显示   6            3            6           3

      一个扩展rowid需要10B的空间存储用18个字符显示其组成如下

      1、数据对象号:唯一标识数据库对象的数据对象号,被赋予每一个对象

      2、相对文件号:对同一个表空间中每一个文件都是唯一的,标识同一个表空间中的不同数据文件

      3、块号:为相对文件中包含数据行的数据块的位置

      4、行号:标识了块头中行目录的位置

      扩展rowid的显示是用一中64位的编码,使用的显示字符为A~Z a~z 0~9和+、/总共64个字符

    oracle使用rowid定位数据行的机制:

      1、使用数据对象号找到表空间

      2、使用相对文件号找到存储的数据文件

      3、使用块号找到存储数据行的数据块

      4、使用行号找到行目录项,然后使用行目录项就可以定位数据行的起始地址

    二、限制rowid

      是oracle7或者之前的版本中使用的与扩展rowid的最大区别是没有数据对象号在内部存储时仅使用6个字节存储。在oracle中定位数据行时通过遍历表空间依次向下寻找直到行号。所以在oracle7i版本之前要求数据文件的个数最多为1022个。在8i后由于添加了数据对象号所以要求tablespace最多不能超过1022个。

    2)oracle数据行的结构

      为了节省存储空间oracle使用了一种特殊的数据行存储结构。每个数据行以变长记录的形式存储在数据块中。通常一行中的列是按照他们被定义的顺序存放的,并且末尾的空列不存储,但是非末尾的空列需要一个字节的存储长度。

    数据行的组成:

      行头:用来存储该行中的列数,迁移信息和行锁的状态

      行数据:由一系列的列长和列值组成对应数据行中的每一列oracle服务器存储该列的列长度和列的实际值

      列长:一般需要一个字节

      列值:列的实际值紧随着列长字节后存放

    oracle的存储是非常紧凑的,在oracle系统中相邻的数据行之间不需要任何空间。数据块中每一行在行目录中都有一个槽,这个槽指向了数据行的起始地址。

      

      

  • 相关阅读:
    [牛客]十二桥问题 解题报告
    [NOIP2017 逛公园] 解题报告
    [JSOI2008]最小生成树计数 解题报告
    类欧几里得算法
    概率与期望题目列表
    [SCOI2008]配对 解题报告
    拦截导弹
    牛客网-约数的个数
    牛客网-成绩排名
    最大连续区间和的算法总结
  • 原文地址:https://www.cnblogs.com/moonfans/p/3871541.html
Copyright © 2020-2023  润新知