• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

[tips]关于rowid的一些内容_sqlserver

sqlserver 搞代码 7年前 (2018-06-16) 207次浏览 已收录 0个评论

 

关于rowid的一些内容

 

http://www.gaodaima.com/35340.html关于rowid的一些内容_sqlserver

作者:刘颖博

时间:2004-6-12

mail:[email protected],请指正

 

转载请注明出处及作者

 

本文讨论的是关于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                                                              

 

 

 

 

欢迎大家阅读《[tips]关于rowid的一些内容_sqlserver,跪求各位点评,若觉得好的话请收藏本文,by 搞代码


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:[tips]关于rowid的一些内容_sqlserver

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址