OracleRowid介绍_无名增士 oracle rowid 排序

DBMS_ROWID是一个比较有用的系统自带的package,主要可以用来处理坏块的问题,于是仔细的研究了一下,这个包可以用来了解file、block、object_id和rowid之间的关系,在Oracle8中被引用进来,Oracle7不支持这个包。这个包的定义可以在dbmsutil.sql中找到,在catproc.sql中被调用,并被给予public执行权限。
1)FUNCTION ROWID_BLOCK_NUMBERRETURNS NUMBER
SQL> select dbms_rowid.rowid_block_number(rowid)from dept;

DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
------------------------------------
16
16
16
16
12
12
2)FUNCTION ROWID_CREATE RETURNS ROWID
创建restricted rowid:
SQL> select dbms_rowid.rowid_create(0,51149,4,16,0)from dual;

DBMS_ROWID.ROWID_C
------------------
00000010.0000.0004
创建extented rowid:
SQL> select dbms_rowid.rowid_create(1,51149,4,16,0)from dual;

DBMS_ROWID.ROWID_C
------------------
AAAMfNAAEAAAAAQAAA
3)PROCEDURE ROWID_INFO
返回一个单独组件的一个指定的rowid,它只能用于PL/SQL,而不能用于sql语句中。
4)FUNCTION ROWID_OBJECT RETURNSNUMBER
返回一个rowid的对象号。如果是restricted 的rowid,则返回0。
5)DBMS_ROWID.ROWID_VERIFY:
验证一个restricted的rowid是否能够转换成extended的rowid,它可以用来发现存在问题的rowid。
6)DBMS_ROWID.ROWID_TO_EXTENDED:
转换一个restricted rowid为一个extended rowid.如果原始的rowid存储在列中,转换的 就是internal类型;如果原始的rowid是以字符串形式存储的,那转换的就是external类型。
7)DBMS_ROWID.ROWID_TO_RESTRICTED:
转换一个exteneded的rowid为一个restricted的rowid,restricted的rowid格式为BBBBBBB.RRRR.FFFFF, BBBBBBB代表block,RRRR 代表在block中的行号,从0开始,FFFFF代表文件号。这个包可以使用rowid或者rowid转换类型(ROWID_CONVERT_INTERNAL (0)和ROWID_CONVERT_EXTERNAL(1))

2.2 . Rowid的结构

ROWID 格式:

扩展的ROWID 在磁盘上需要10 个字节的存储空间,并使用18 个字符来显示。

它包含下列组成元素:

1. 数据对象编号:每个数据对象(如表或索引)在创建时都分配有此编号,并且此编号在数据库中是唯一的

2. 相关文件编号:此编号对于表空间中的每个数据文件是唯一的

3. 块编号:表示包含此行的块在数据文件中的位置

4. 行编号:标识块头中行目录位置的位置

在内部,存储的10个字节(bytes),即80位(bit)又按如下规则进行划分:

(1)数据对象编号需要32 bit

(2)相关文件编号需要10 bit

(3)块编号需要22 bit

(4)行编号需要16 bit

在oracle 8以前,一个rowid占用6个字节大小的存储空间(10bit file#+22bit block#+16bit row#),rowid格式为:BBBBBBBB.RRRR.FFFF。

在oracle 8以后,rowid的存储空间扩大到了10个字节(32bit object#+10bit rfile#+22bit block#+16bitrow#),文件号仍然用10位表示,只是不再需要置换,为了向后兼容,同时引入了相对文件号(rfile#),所以从Oracle7到Oracle8,Rowid仍然无需发生变化.

Rdba(Tablespace relative database blockaddress)就是rowid中的rfile#+block#.

rowid这样改变之后,数据库中数据库文件个数的限制从整个数据库最多只能有的2^10-2=1022个数据文件(去掉全0和全1), 变为了每个表空间中可以最多有2^10-2个数据文件。

所以说,数据库能支持的数据文件最大数是受rowid的长度限制的。

需要注意的是: localindex中存储的rowid是6个字节,而global index中存储的rowid是10个字节。

那么增加的32bitobject# 这个前缀主要就是用来定位表空间的,同时这个object#其实对应的就是data_object_id,由于一个段对象只能属于一个表空间,同时data_object_id就是标识了一个段的物理存储id.因此object#+rfile#就可以唯一定位当前的rowid是在那个数据文件上了。

可以通过dbms_rowid这个包来转换我们的rowid成不同组成部分:

dbms_rowid.rowid_object(rowid)---> 32bitobject#
dbms_rowid.rowid_relative_fno(rowid)---> 10bitrfile#
dbms_rowid.rowid_block_number(rowid)---> 22bitblock#
dbms_rowid.rowid_row_number(rowid)---> 16bitrow#

扩展的ROWID 使用以64 为基数的编码方案来显示,该方案将六个位置用于数据对象编号、三个位置用于相关文件编号、六个位置用于块编号、三个位置用于 行编号。

以64 为基数的编码方案使用字符“A-Z”、“a-z”、“0-9”和“/”。共有64 个字符,如下例所示:

SQL> SELECT department_id, rowid FROMhr.departments;

EMPNO ROWID

----------------------------

7488 AAAMfPAAEAAAAAgAAA

7499 AAAMfPAAEAAAAAgAAB

7521 AAAMfPAAEAAAAAgAAC

7566 AAAMfPAAEAAAAAgAAD

7654 AAAMfPAAEAAAAAgAAE

7698 AAAMfPAAEAAAAAgAAF

7782 AAAMfPAAEAAAAAgAAG

7788 AAAMfPAAEAAAAAgAAH

7839 AAAMfPAAEAAAAAgAAI

7844 AAAMfPAAEAAAAAgAAJ

7876 AAAMfPAAEAAAAAgAAK

7900 AAAMfPAAEAAAAAgAAL

在本例中:

AAAMfP 是数据对象编号

AAE 是相关文件编号

AAAAAg是块编号

AAA是EMPNO=7488 的部分的行编号






  

爱华网本文地址 » http://www.413yy.cn/a/25101015/238853.html

更多阅读

三亚潜水点介绍_三亚潜水攻略 三亚潜水sydiver

目前国内最棒的潜水圣地自然非海南三亚莫属!这是因为位于海南南段的三亚拥有绵蜓约8公里柔软细腻的沙滩,海滩长度约是美国夏威夷的3倍,海底珊蝴礁保存十分完好,是国家级珊蝴礁重点保护区。那里的海水清澈澄莹,能见度在8到16米,有些地方可

高级海员专业介绍_海员在线 高级海员

学校设置船员船舶驾驶、轮机管理、船舶修造、船舶电气、国际物流专业,已开设专业有船舶驾驶专业和轮机管理专业。中专职业教育船舶驾驶专业主要培养符合国际海事组织(IMO)制定的国际海员培训、发证、值班标准(STCW78/95公约)掌握现代

如何丰脸?玻尿酸丰脸的优点介绍_厦门整形 玻尿酸丰脸多少钱

  生活中有些女孩子天生脸瘦,但是却显得颧骨高,从而缺乏女性应有的优美,因此很多女性朋友想丰脸。  脸瘦怎么丰脸呢?丰脸属于比较困难的行为,单纯走饮食路线的话,略微不小心就就会把肉长到不该长的地方,玻尿酸丰脸是一个很好的选择。

声明:《OracleRowid介绍_无名增士 oracle rowid 排序》为网友滚滚滚滚分享!如侵犯到您的合法权益请联系我们删除