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

  

  

oracle中的rowid和数据行的结构的更多相关文章

  1. Oracle中的rowid

    ROWID是ORACLE中的一个重要的概念.用于定位数据库中一条记录的一个相对唯一地址值.通常情况下,该值在该行数据插入到数据库表时即被确定且唯一.ROWID它是一个伪列,它并不实际存在于表中.它是O ...

  2. 向oracle中的表插入数据的方法

    向oracle中的表插入数据的方法有以下几种: 假设表名为User 第一种方法:select t.*,rowid from User t;-->点击钥匙那个标记就可向表中添加数据 第二种方法:s ...

  3. for循环往Oracle中插入n条数据,主键自增

    1.主键自增实现方法:http://www.cnblogs.com/Donnnnnn/p/5959871.html 2.for循环往Oracle中插入n条数据 BEGIN .. loop insert ...

  4. Oracle中使用游标转换数据表中指定字段内容格式(拼音转数字)

    应用场景:将数据表TB_USER中字段NNDP的内容中为[sannanyinv]转换为[3男1女] 主要脚本:一个游标脚本+分割字符串函数+拼音转数字脚本 操作步骤如下: 1.创建类型 create ...

  5. Oracle中的rowid rownum

    1. rowid和rownum都是虚列 2. rowid是物理地址,用于定位oracle中具体数据的物理存储位置 3. rownum则是sql的输出结果排序,从下面的例子可以看出其中的区别. rowi ...

  6. oracle中number类型的数据使用as string 得到的值为null

    1,如果数据的运行时类型(和数据库字段类型相同)不是字符串类型,比如number/date等,将ds.Tables[0].Rows[i][j] 调用 as string 时,不管 这个字段是否有值,这 ...

  7. 查看SqlAzure和SQLServer中的每个表数据行数

    SqlAzure中的方式: select t.name ,s.row_count from sys.tables t join sys.dm_db_partition_stats s ON t.obj ...

  8. oracle中字符串与表数据拼接的用法--“||”

    测试过程中,经常需要批量删除或者插入.修改一些表数据或结构,使用手工复制.粘贴其实很麻烦,所以这是我们就可以使用拼接成sql语句的方法来实现操作数据.下面先讲讲oracle中拼接符 || 的用法,如下 ...

  9. oracle中insert 多条数据方法

    oracle中的insert 和 mysql添加多条数据的 方式不太一样 用到的语法: insert all into 表名(需要添加的表字段)values(添加的字段数据一定要对应字段顺序) int ...

随机推荐

  1. codeforces 340E Iahub and Permutations(错排or容斥)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Iahub and Permutations Iahub is so happy ...

  2. UVA11401Triangle Counting(简单计数)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud 题目意思:从1,2,3,……,n中选出3个不同的整数使其构成一个三角形,有多少种方 ...

  3. winform 读取保存配置文件

    原文连接: public static string fileName = System.IO.Path.GetFileName(Application.ExecutablePath);        ...

  4. 用PHP向MySql中写入图片

    我们经常遇到的问题是如何将图片文件放到Mysql数据库当中,这样可以避免没有认证的用户找到我们的图片资源! 1.看看数据库里的表结构怎么写 CREATE TABLE Images (     PicN ...

  5. Blogger建立Blog部落格​​ - Blog透视镜

    Google谷歌提供Blogger免费建立Blog部落格服务,高自由度的设计,模版全面开放,允许你加入HTML/Script,最重要的是可以自定义网域,辛苦经营的Blog部落格,不希望有朝一日,倘若搬 ...

  6. Qt中调用PolarSSL库(一)

    最近一直在学习SSL相关的知识,也是先了解理论相关的知识,主要是SSL相关的基本概念和连接建立过程,主要是基于PolarSSL开源库进行学习.学习完了之后就希望能给有所运用,就想用Qt写一个简单的程序 ...

  7. 如何从Eclipse导入github上的项目源码

    1.首先在github.com上申请一个账号,比如笔者的账号为puma0072.Eclipse需要安装egit插件,在Eclipse中选择help->Marketplace,在search中输入 ...

  8. RTP 包格式 详细解析

    H.264 视频 RTP 负载格式 1. 网络抽象层单元类型 (NALU) NALU 头由一个字节组成, 它的语法如下: +---------------+      |0|1|2|3|4|5|6|7 ...

  9. 【排序】表插入排序算法(C语言版)

    排序耗时的操作主要分为两种:查找比较.记录移位. 1.表插入排序 在查找比较基础上,尽量减少记录移位步数,可以令排序操作耗时降低,表插入排序正是为减少移位次数而出现的. 在数据结构上,数据是存储在静态 ...

  10. java 防止sql注入的方法(非原创)

      一.SQL注入简介       SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库. 二.SQ ...