Oracle学习指南之rowid详解
本篇文章给大家带来了关于Oracle的相关知识,其中主要介绍了关于rowid的相关问题,oracle数据库的表中的每一行数据都有一个唯一的标识符,或者称为rowid,在oracle内部通常就是使用它来
本篇文章给大家带来了关于Oracle的相关知识,其中主要介绍了关于rowid的相关问题,oracle数据库的表中的每一行数据都有一个唯一的标识符,或者称为rowid,在oracle内部通常就是使用它来访问数据的,希望对大家有帮助。<p><img src="https://img.mryunwei.com/uploads/2023/04/20230415132453935.jpg"></p>
推荐教程:《Oracle学习教程》
一、rowid中保存信息概述
oracle数据库的表中的每一行数据都有一个唯一的标识符,或者称为rowid,在oracle内部通常就是使用它来访问数据的。rowid需要 10个字节的存储空间,并用18个字符来显示。该值表明了该行在oracle数据库中的物理具体位置。可以在一个查询中使用rowid来表明查询结果中包含该值。
保存rowid需要10个字节或者是80个位二进制位。一个扩展rowid采用10个byte来存储,共80bit,其中obj#32bit,rfile#10bit,block#22bit,row#16bit。所以相对文件号不能超过1023,也就是一个表空间的数据文件不能超过1023个(不存在文件号为0的文件),一个datafile只能有2^22=4M个block,,一个block中不能超过2^16=64K行数据。而一个数据库内不能有超过2^32=4G个object。 这80个二进制位分别是: 1. 数据对象编号,表明此行所属的数据库对象的编号,每个数据对象在数据库建立的时候都被唯一分配一个编号,并且此编号唯一。数据对象编号占用大约32位。 2. 对应文件编号,表明该行所在文件的编号,表空间的每一个文件标号都是唯一的。文件编号所占用的位置是10位。 3. 块编号,表明改行所在文件的块的位置块编号需要22位。 4. 行编号,表明该行在行目录中的具体位置行编号需要16位。 这样加起来就是80位。
备注:在oracle 8版本以前,rowid由file# block# row#组成,占用6个bytes的空间,10 bit 的 file# ,22bit 的 block# ,16 bit 的 row#。oracle8及之后版本改为10个bytes的空间。
Oracle的物理扩展ROWID有18位,每位采用64位编码,分别用A~Z、a~z、0~9、+、/共64个字符表示。A表示0,B表示1,……Z表示25,a表示26,……z表示51,0表示52,……,9表示61,+表示62,/表示63。
为了验证rowid的存储空间为10字节,其中32bit的object#,10bit的rfile#,22bit的block#,16bit的row#。我们需要使用dump函数。
object_id和data_object_id 都是对象的唯一标识。
object_id是对象的逻辑标识
data_object_id是对象的物理标识
只有表,索引,undo这些有实际物理存储位置的对象才有data_object_id。而对于没有物理存储的对象,data_object_id就是空。例如:(procedure,function,package,data type,db link,mv定义,view定义,临时表,分区表定义等等)
大多数情况下两者是相等的。但对object 进行truncate,move, rebuild 等操作后,data_object_id就会发生改变,而object_id不会改变。
从Oracle8开始,Oracle开始使用“相对文件号”,使原来一个数据库最多只能有1023个文件,扩展为一个表空间最多可以有1023个文件,每个库最多可以有65534个文件
我们可以使用跟踪文件查看数据文件信息,命令:alter session set events 'immediate trace name FILE_HDRS level 10';
执行完此代码后,将在数据库服务器生成一个跟踪文件,查看文件路径代码: