欢迎光临
我们一直在努力

[tips]关于rowid的一些内容-数据库专栏,SQL Server

建站超值云服务器,限时71元/月

 

关于rowid的一些内容

 

作者:刘颖博

时间:2004-6-12

mail:liuyingbo@126.com,请指正

 

转载请注明出处及作者

 

本文讨论的是关于oracle从8i开始引进object的概念后的rowid,即扩展(extended)的rowid:

 

1.       rowid的介绍

 

先对rowid有个感官认识:

sql> select rowid from bruce_test where rownum<2;

rowid
—————— ———-
aaabnlaafaaaaapaaa

 

rowid的格式如下:

数据对象编号        文件编号        块编号           行编号

oooooo             fff                bbbbbb  rrr

 

我们可以看出,从上面的rowid可以得知:

 

aaabnl 是数据对象编号

aaf是相关文件编号

aaaaap是块编号

aaa 是行编号

 

怎么依据这些编号得到具体的十进制的编码值呢,这是经常遇到的问题。这里需要明白rowid的是基于64位编码的18个字符显示(数据对象编号(6) +文件编号(3) +块编号(6)+       行编号(3)=18位),其中

a-z <==> 0 – 25 (26)
a-z <==> 26 – 51 (26)
0-9 <==> 52 – 61 (10)
+/ <==> 62 – 63 (2)

共64位,明白这个后,就可以计算出10进制的编码值,计算公式如下:

d * (b ^ p)

其中:b就是基数,这里就是64,p就是从右到左,已0开始的位置数

比如:上面的例子

文件号aaf,具体的计算应该是:

5*(64^0)=5;

0*(64^1)=0;

0*(64^2)=0;

文件号就是0+0+5=5

 

刚才提到的是rowid的显示方式:基于64位编码的18个字符显示,其实rowid的存储方式是:10 个字节即80位存储,其中数据对象编号需要32 位,相关文件编号需要10 位,块编号需要22,位行编号需要16 位,由此,我们可以得出:

 

 

 

32bit的object number,每个数据库最多有4g个对象

10bit的file number,每个对象最多有1022个文件(2个文件预留)

22bit的block number,每个文件最多有4m个block

16bit的row number,每个block最多有64k个rows

 

 

2.       rowid相关的有用的sql

 

 

 

最简单的基于rowid的显示方式得到的响应的64位编码对应值的sql:

select rowid ,

substr(rowid,1,6) “object”,

substr(rowid,7,3) “file”,

substr(rowid,10,6) “block”,

substr(rowid,16,3) “row”

from tablename;

 

 

owid              object       file   block        row

—————— ———— —— ———— ——

aaabc4aadaaagluaaa aaabc4       aad    aaaglu       aaa

aaabc4aadaaagluaab aaabc4       aad    aaaglu       aab

aaabc4aadaaagluaac aaabc4       aad    aaaglu       aac

aaabc4aadaaagluaad aaabc4       aad    aaaglu       aad

aaabc4aadaaagluaae aaabc4       aad    aaaglu       aae

 

 

通过dbms_rowid这个包,可以直接的得到具体的rowid包含的信息:

 

select dbms_rowid.rowid_object(rowid)  object_id, dbms_rowid.rowid_relative_fno(rowid) file_id,
dbms_rowid.rowid_block_number(rowid)  block_id ,dbms_rowid.rowid_row_number(rowid)  num from bruce_t where rownum<5;

 

object_id    file_id   block_id        num

———- ———- ———- ———-

      5944          3      25300          0

      5944          3      25300          1

      5944          3      25300          2

      5944          3      25300          3

 

一些使用rowid的函数
rowidtochar(rowid) :将rowid转换成string
chartorowid(rowid_string) :将string转换成rowid

 

另外,就是自己写的一些函数:(下面的函数是网友eygle提供)

 

create or replace function get_rowid

(l_rowid in varchar2)

return varchar2

is

ls_my_rowid     varchar2(200);          

rowid_type     number;          

object_number     number;          

relative_fno     number;          

block_number     number;          

row_number     number;  

begin

 dbms_rowid.rowid_info(l_rowid,rowid_type,object_number,relative_fno, block_number, row_number);          

 ls_my_rowid := object# is      :||to_char(object_number)||chr(10)||

        relative_fno is :||to_char(relative_fno)||chr(10)||

        block number is :||to_char(block_number)||chr(10)||

        row number is   :||to_char(row_number);

 return ls_my_rowid ;

end;          

/

应用上面的函数如下:

sql> select get_rowid(rowid), name from bruce_t;

get_rowid(rowid)                                                                 name

——————————————————————————– ——————————–

object# is      :5944                                                      brucelau

relative_fno is :3                                                              

block number is :25300                                                           

row number is   :0                                                              

 

object# is      :5944                                                     mabeltang

relative_fno is :3                                                               

block number is :25300                                                          

row number is   :1                                                              

 

 

 

 

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » [tips]关于rowid的一些内容-数据库专栏,SQL Server
分享到: 更多 (0)