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代表在数据块中的行.

假设建立下面一个表:

create table tb(id int,name varchar2(10))

insert into tb values(1,‘a‘)

insert into tb values(2,‘b‘)

通过select rowid,id from tb得到:

AAANgBAABAAAO/KAAA    1

AAANgBAABAAAO/KAAB    2

以AAANgB AAB AAAO/K AAA  为例,

AAANgB为表tb的id,

通过select * from all_objects where object_name=‘TB‘ 看到 object_id为55297,

计算AAANgB的10进制的值为:select 13*64*64+32*64+1 from dual 得到的值也为55297.

AAB为数据文件的编号:1,代表dba_data_files的file_id,通过select * from dba_data_files可以看到对应的数据文件信息.

AAAO/K代表块的编号:61386,通过 select 14*64*64 +63*64 + 10 from dual计算得到

行的编号是:0,上面两行是邻接的,仅仅行号不同.

通过下面的sql可以查看这个数据块是不是加载到了数据缓冲区:select * from v$bh where block#=61386 and file#=1

知道了块号之后,可以dump这个块在内存(数据缓冲区)中的内容: alter system dump datafile 1 block 61386

知道了块号之后,可以dump这个块在数据文件中的内容:

alter system dump datafile ‘D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF‘  block 61386

(由于Oracle的写数据到数据文件并不一定在commit后就完成,可以通过ALTER SYSTEM checkpoint强制将数据有数据缓冲区写入数据文件)

然后在udump文件夹下的trace文件中可以看到dump的内容.

Oracle中的一个package dbms_rowid里直接提供了函数来得到块号,行号

dbms_rowid.rowid_object:对象编号

dbms_rowid.rowid_relative_fno:文件编号

dbms_rowid.rowid_block_number:块号

dbms_rowid.rowid_row_number:行号

例:select rowid,id,dbms_rowid.rowid_block_number(rowid) from tb

推荐看http://www.itpub.net/thread-912812-1-1.html有非常详细的见解。

时间: 2024-10-19 03:26:02

Oracle 中的rowid的相关文章

Oracle中的rowid

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

oracle中的rowid和数据行的结构

在oracle数据库系统中每一行都有一个rowid,oracle数据库系统就是利用rowid来定位数据行的.rowid也是oracle中内置的一个标量数据类型 rowid有一下特点; 是数据库中每一行的唯一标识 并不是显示的存储某一列的值 可以用来定位行,虽然没有直接给出行的物理地址 提供了访问一张表中数据行的最快机制 1)rowid有两种类型:限制rowid和扩展rowid 一.扩展rowid 扩展rowid是oracle8i之后的版本中引入的,其结构如下: 数据对象号+相对文件号+块号+行号

[转载]mysql中实现行号,oracle中的rowid

mysql中实现行号需要用到MYSQL的变量,因为MySql木有rownumber. MYSQL中变量定义可以用 set @var=0 或 set @var:=0 可以用=或:=都可以,但是如果变量用在其他语句中,如:select那么必须用:=,因为=会被当作一个比较符号 1 select @rownum:[email protected]+1 as rownum, b.* from (select @rownum:=0) a, b 这个很有用哦,比如要取到排名好多的.

浅谈oracle中rowid和rownum

[ 概要 ] 刚刚接触oracle的同学可能常常会被rowid和rownum这两个词弄混, 弄清楚这两个家伙对于我们写sql会有很大的帮助, 下面偶就抛砖引玉, 简单地谈谈他们之间的区别吧. [ 比较 ] rowid和rownum都是oracle中的伪列, 但他们还是存在本质区别: rowid: 是物理地址, 用于定位数据表中数据的位置, 它是唯一的且不会改变. rownum: 是根据查询的结果集给每行分配的一个逻辑编号, 查询结果不同, rownum自然不同. 对于同一条记录, 查询条件不同,

【转】Oracle 中 rownum与rowid

对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=),并非说用>,>=,=,between..and 时会提示SQL语法错误,而是经常是查不出一条记录来,还会出现似乎是莫名其妙的结果来,其实您只要理解好了这个 rownum 伪列的意义就不应该感到惊奇. rowid与rownum 虽都被称为伪列,但它们的存在方式是不一样的,rowid 可以说是物理存在的,表示记录在表空间中的唯一位置ID,

(转)Oracle中的rownum,ROWID的 用法

场景:在书写oracle的sql语句时候,如果语句不存在主键,需要删除几条重复的记录,这个时候如果不知道oracle中的伪列,就需要把所有的重复记录先删除,再插入.这样做好麻烦,可以通过伪列来定位记录. 1 ROWNUM的使用——TOP-N分析 使用SELECT语句返回的结果集,若希望按特定条件查询前N条记录,可以使用伪列ROWNUM. ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集).简单的说ROWNUM是符合条件结果的序列号.它总是从1开始排起的

Oracle中的rownum,ROWID的 用法

1.ROWNUM的使用——TOP-N分析 使用SELECT语句返回的结果集,若希望按特定条件查询前N条记录,可以使用伪列ROWNUM. ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集).简单的说ROWNUM是符合条件结果的序列号.它总是从1开始排起的. 使用ROWNUM时,只能使用<.<=.!=符号. 举例: student(学生)表,表结构为: ID     char(6) --学号 name VARCHAR2(10) --姓名 --建表 cre

Oracle中rownum理解及和rowid的区别

rownum,rowid都叫伪列. 但是,rownum是逻辑上的编号,且其值总是从1开始,每行的rounum不是固定的.而rowid是“物理”编号.若数据库文件没有移动,则每行的 rowid一般是固定不变的. oracle中rownum用法的总结 对于 Oracle的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=),并非说用>,>=,=,between..and时会提示SQL语法错误,而是经常是查不出一条

oracle中的游标(转)

Oracle中的游标有两种:显式游标.隐式游标.显示游标是用cursor...is命令定义的游标,它可以对查询语句(select)返回的多条记录进行处理,而隐式游标是在执行插入 (insert).删除(delete).修改(update)和返回单条记录的查询(select)语句时由PL /SQL 自动定义的. 显式游标 当声明了显式游标后,可以通过以下三条命令控制显式游标的操作:打开游标.推进游标.关闭游标. 声明显式游标 Ø  无参游标 cursor c_auths is select * f