您现在的位置是:群英 > 数据库 > 关系型数据库
Oracle rowid是什么意思,如何验证查看rowid
Admin发表于 2022-05-11 14:15:042068 次浏览
相信很多人对“Oracle rowid是什么意思,如何验证查看rowid”都不太了解,下面群英小编为你详细解释一下这个问题,希望对你有一定的帮助



本篇文章给大家带来了关于Oracle的相关知识,其中主要介绍了关于rowid的相关问题,oracle数据库的表中的每一行数据都有一个唯一的标识符,或者称为rowid,在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。

SELECT T.ROWID, T.* FROM DEPT T

为了验证rowid的存储空间为10字节,其中32bit的object#,10bit的rfile#,22bit的block#,16bit的row#。我们需要使用dump函数。

select rowid,dump(rowid,16) from DEPT

二、验证查看rowid内容

1、使用dbms_rowid包中函数查看

SELECT ROWID,
       DBMS_ROWID.ROWID_OBJECT(ROWID) AS OBJECT,
       DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) AS FILENUM,
       DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) AS BLOCK,
       DBMS_ROWID.ROWID_ROW_NUMBER(ROWID) AS ROWN
  FROM DEPT;

结果如下:

2、从表中查询数据信息

1)查询对象编号:DATA_OBJECT_ID

SELECT OBJECT_NAME, OBJECT_TYPE, SUBOBJECT_NAME, OBJECT_ID, DATA_OBJECT_ID
  FROM DBA_OBJECTS T
 WHERE T.OBJECT_NAME ='DEPT'
 AND T.OWNER = 'CHF';

结果如下:

说明:DATA_OBJECT_ID与OBJECT_ID的区别

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不会改变。

对标DEPT执行truncate操作,代码:TRUNCATE TABLE DEPT;

再次查询结果:

将truncate前数据重新插入表中,查看rowid代表对象号的部分已发生变化由AAAUOO变为AAAUOP,增加了1。

2)查询文件编号:

SELECT T.SEGMENT_NAME, T.HEADER_BLOCK, T.BLOCKS, T.EXTENTS, T.RELATIVE_FNO
  FROM DBA_SEGMENTS T
 WHERE T.SEGMENT_NAME = 'DEPT'
   AND T.OWNER = 'CHF';

HEADER_BLOCK:本表的第一个数据块号

BLOCKS:本表的数据块数

RELATIVE_FNO:相对文件编号

结果如下:

说明:

从Oracle8开始,Oracle开始使用“相对文件号”,使原来一个数据库最多只能有1023个文件,扩展为一个表空间最多可以有1023个文件,每个库最多可以有65534个文件

验证文件号

SELECT T.TABLE_NAME,
       T.TABLESPACE_NAME,
       G.FILE_NAME,
       G.FILE_ID,
       G.RELATIVE_FNO
  FROM DBA_TABLES T
 INNER JOIN DBA_DATA_FILES G
    ON G.TABLESPACE_NAME = T.TABLESPACE_NAME
 WHERE T.TABLE_NAME = 'DEPT'
 AND T.OWNER = 'CHF';

执行结果:

因为创建用户时没用指定默认表空间,建表时也没用指定表空间,所以此处使用的USERS表空间(大家不必在意这些细节...),可以看到文件号和相对文件号都是 4 ,这是因为我的数据库中每个表空间只有一个数据文件,如果一个表空间有多个数据文件,这两个值有可能不一样。

知识扩展:

我们可以使用跟踪文件查看数据文件信息,命令:alter session set events 'immediate trace name FILE_HDRS level 10';

执行完此代码后,将在数据库服务器生成一个跟踪文件,查看文件路径代码:

select
  u_dump.value || '/' ||
  db_name.value || '_ora_' ||
  v$process.spid ||
  nvl2(v$process.traceid, '_' || v$process.traceid, null )
  || '.trc' "Trace File"
from
v$parameter u_dump
cross join v$parameter db_name
cross join v$process
join v$session
on v$process.addr = v$session.paddr
where
  u_dump.name = 'user_dump_dest' and
  db_name.name = 'db_name' and
  v$session.audsid=sys_context('userenv','sessionid');
  • 下一篇:oracle怎么删除唯一约束

以上就是关于“Oracle rowid是什么意思,如何验证查看rowid”的介绍了,感谢各位的阅读,希望文本对大家有所帮助。如果想要了解更多知识,欢迎关注群英网络,小编每天都会为大家更新不同的知识。

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

标签: oracle rowid
相关信息推荐
2022-11-03 17:56:38 
摘要:mysql中执行存储过程的语句是“CALL”。CALL语句可以调用指定存储过程,调用存储过程后,数据库系统将执行存储过程中的SQL语句,然后将结果返回给输出值;语法为“CALL 存储过程的名称([参数[...]]);”。mysql中利用CALL语句调用并执行存储过程需要拥有EXECUTE权限才可生效。
2022-05-18 16:12:02 
摘要:mysql错误1005的解决办法:1、使用“SHOW ENGINE INNODB STATUS;”命令查看错误的详细提示;2、修改“LATEST FOREIGN KEY ERROR”。
2022-08-13 17:51:50 
摘要:在mysql中,添加字段的语句是“​ALTER TABLE 表名 ADD 新字段名 数据类型 约束条件”,ALTER命令用于修改数据表名或者修改数据表字段,默认情况下字段会添加在数据末尾。
群英网络助力开启安全的云计算之旅
立即注册,领取新人大礼包
  • 联系我们
  • 24小时售后:4006784567
  • 24小时TEL :0668-2555666
  • 售前咨询TEL:400-678-4567

  • 官方微信

    官方微信
Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
微信公众号
返回顶部
返回顶部 返回顶部