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

  

  

oracle中的rowid和数据行的结构

时间: 2024-10-19 03:25:57

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

Oracle中的rowid

ROWID是ORACLE中的一个重要的概念.用于定位数据库中一条记录的一个相对唯一地址值.通常情况下,该值在该行数据插入到数据库表时即被确定且唯一.ROWID它是一个伪列,它并不实际存在于表中.它是ORACLE在读取表中数据行时,根据每一行数据的物理地址信息编码而成的一个伪列.所以根据一行数据的ROWID能找到一行数据的物理地址信息.从而快速地定位到数据行.数据库的大多数操作都是通过ROWID来完成的,而且使用ROWID来进行单记录定位速度是最快的. 要理解索引,必须先搞清楚ROWID. B-T

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

向oracle中的表插入数据的方法有以下几种: 假设表名为User 第一种方法:select t.*,rowid from User t;-->点击钥匙那个标记就可向表中添加数据 第二种方法:select t.*,rowid from User t for update;-->点击钥匙那个标记就可向表中添加数据 第三种方法:在oracle中的table表中选中你要添加数据的那个表-->点击右键-->选中Edit data-->就可向表中添加数据 第四种方法:通过DAO层来添加

Oracle执行计划并取得数据行

一个执行计划就是告诉Oracle对于每一个表对象使用哪种访问方法以及什么联接和联接顺序来将多个表联接到一起的一系列命令.执行计划中的每个步骤产生一个行源,然后与另外一个行源相联接,直到所有对象都被访问和联接. Oracle中的查询计划将会完成解析,绑定,执行和提取的步骤. Oracle每次访问数据块的时候,Oracle都会从该块中取出数据行然后在一次回路中返回给客户端.一次返回的行数是一个可配置的值称为列大小.列大小是一个网络回路中一次可以传输的可能行数.而列大小的设置可以是通过编程改变.在SQ

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

应用场景:将数据表TB_USER中字段NNDP的内容中为[sannanyinv]转换为[3男1女] 主要脚本:一个游标脚本+分割字符串函数+拼音转数字脚本 操作步骤如下: 1.创建类型 create or replace type splitTable is table of varchar2(100); 2.创建函数fn_splitString(功能是将字符串分割成多条记录)--测试语句select * from table(fn_splitString('ernanyinv','nan'))

Oracle 中的rowid

Oracle中的每个表都有一个rowid,它是一个18位字符组成字符串,例:AAANgBAABAAAO/KAAA.它包含的字符串由A-Z,a-z,0-9,+,/这些字符组成.是64进制. 其中A-Z对应0-25,a-z对应26-51,0-9对应52-61,+对应62,/对应63. 这个18位的字符串分成4段分别表示不同的意思(6,3,6,3),1-6位表示对象数据ID(段编号),7-9位代表数据文件编号,10-15位代表数据块编号,16-18代表在数据块中的行. 假设建立下面一个表: creat

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

1,如果数据的运行时类型(和数据库字段类型相同)不是字符串类型,比如number/date等,将ds.Tables[0].Rows[i][j] 调用 as string 时,不管 这个字段是否有值,这样都会得到null. as string 只会将 运行时类型为string的对象转为字符串,如果运行时类型不是string,就会得到 null 而不报错. 2,如果从数据库中查到的数据可能为null ,就调用Convert.ToString() 类转换. 如果它不会为Null,就直接调用 .ToSt

Oracle中对XML格式数据的操作,CLOB类型转换XMLType类型

今天遇到个问题,关于Oracle中xml格式数据的操作. 问题记录:需求上明确该字段类型为xmltype,要做的是解析该字段,但是由于数据库设计人员的问题,某些表中的该字段类型设计成了Clob类型. 解决方法: xmltype类型解析很容易:使用extractvalue函数即可,用法: select column_name1,column_name2,extractvalue(column_name3,'/nodeName1/nodeName2/nodeName3') from table; c

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

SqlAzure中的方式: select t.name ,s.row_count from sys.tables t join sys.dm_db_partition_stats s ON t.object_id = s.object_id and t.type_desc = 'USER_TABLE' and t.name not like '%dss%' and s.index_id = 1 order by row_count desc SQLServer的方式: select a.name

Sqlite中使用rowid来表示行号,用于分页。

在SQLite的查询结果中显示行号,可以使用select rowid as RowNumber ,* from WSCLanguage: select rowid as RowNumber ,* from WSCLanguage ORDER BY CreateTime; select distinct keyword from articlecontent;  /* select last_insert_rowid()  aaa   返回最后一条记录ID*/ select *  from (se