oracle基础知识之rowid学习

官方文档:

rowid :A globally unique address for a row in a database.

rowid用于确定数据库中唯一的行(包含数据库中的所有对象)

SQL> select rowid from test1 where rownum=1;

ROWID
------------------
AABbWOAABAAAcCaAAA

看到rowid是有64进制的18个字符组成的

A-Z代表0-25

a-z代表26-51

0-9代表52-61

+代表63

/代表64

其中18个字符分成4部分为:6字符+3字符+6字符+3字符

以上面的rowid为例子:

AABbWO     AAB                           AAAcCa          AAA

对象编号     相对文件号              数据块号          记录行号

记忆方法:从对象出发,一个对象可以跨多个数据文件,一个数据文件包含多个数据块,一个数据块有包含多行记录

上面说的通过sql就能看得见的rowid的现实方法,下面介绍一下rowid的存储方式:

rowid占10个字节即80个bit存储的,其中32位的对象号,10位的相对数据文件号,22位的数据块号,16位的记录编号

所以,一个数据库中最多可有4G个对象

每个数据库最多有1022个数据文件(2个为保留)

每个数据文件对多有4M个数据块

每个数据快最多有64k行记录


SQL> select rowid,substr(rowid,1,6) "object",substr(rowid,7,3) "file",substr(rowid,10,6) "block",substr(rowid,16,3) "row" from test1 where rownum<3;

ROWID              object       file   block        row                        
------------------ ------------ ------ ------------ ------                     
AABbWOAABAAAcCaAAA AABbWO       AAB    AAAcCa       AAA                        
AABbWOAABAAAcCaAAB AABbWO       AAB    AAAcCa       AAB       

 

将64位显示的rowid转换为10进制的办法,是用oracle提供的dbms_rowid包                 

SQL> select dbms_rowid.rowid_object(rowid) object_id from test1 where rownum=1;

 OBJECT_ID                                                                     
----------                                                                     
    374158                                                                     

SQL> select dbms_rowid.rowid_relative_fno(rowid) from test1 where rownum=1;

DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID)                                           
------------------------------------                                           
                                   1                                           

SQL> select dbms_rowid.rowid_block_number(rowid) from test1 where rownum=1;

DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)                                           
------------------------------------                                           
                              114842                                           

SQL> select dbms_rowid.rowid_row_number(rowid) from test1 where rownum=1;

DBMS_ROWID.ROWID_ROW_NUMBER(ROWID)                                             
----------------------------------                                             
                                 0            

由上面的结果得到test1的对象号为374158,其中第一行记录存储在1号文件的第114842号block中,对应的行号是0。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值