zoukankan      html  css  js  c++  java
  • 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系统中相邻的数据行之间不需要任何空间。数据块中每一行在行目录中都有一个槽,这个槽指向了数据行的起始地址。

      

      

  • 相关阅读:
    存储过程
    输入http://localhost/,apache出现You don't have permission to access/on this server.的提示,如何解决?
    搭建内网的NTP时间服务器
    cobbler自动化安装系统
    Linux三剑客之awk最佳实践
    ansible学习笔记
    2021.05.07 多线程之可重入锁
    2021.05.08 easyExcel简单读写
    2021.05.03 Java常用文件路径
    2021.05.04 二维码生成与解析
  • 原文地址:https://www.cnblogs.com/moonfans/p/3871541.html
Copyright © 2011-2022 走看看