|
Rowid简单总结
本文是看到了精华帖中的warehouse的“rowed的一点总结”后写的一点总结,主要是自己归纳的一个过程。原来一直弄不明白显示rowid的18位64进制和10byte之间的关系,看了此文后总算有点理解了。感谢warehouse!
Rowid分类:物理rowid,逻辑rowid
物理rowid:extended rowid,restricted rowid
restricted rowid是oracle7 采用的,从oracle8开始都是使用extended rowid,主要是因为数据量的膨胀原来的rowid不够用了。
逻辑rowid出现有两个原因:iot表的记录物理上可能会发生变化,如果用物理rowid就不适用了;其次是oracle数据库可能会引用一些其他数据库(db2等)的数据,对于这部分数据也只能用逻辑rowid。逻辑rowid是基于primary key的所以iot表必须有pk。
显示:18位64进制字符
OOOOOO FFF BBBBBB RRR 对应 data_object_id, rfile#, block#, Rows
显示出来的是64进制数,oracle在设计rowid时用A~Z表示0-25,用a~z表示26-51,用0~9表示52-61,用+表示62,用/表示63
例如:AAACdcAABAAAHCKAAA
AAACdc = 2*power(64,2)+29*64+28 OOOOOO
AAB = 2 FFF
AAAHCK = 7*power(64,2)+2*64+10 BBBBBB
AAA =0 RRR
内部处理:
Rowid是伪列,在数据库中是不进行存储的(某些特殊情况除外例如索引中)而是在获取时根据存储位置构造出来的。
sql>SELECT VSIZE(ROWID) FROM SCOTT.EMP;
10
Rowid在显示上采用的是64位编码,但是内部处理上是通过10个字节即80位来进行的。
其中data_object_id占用32 位
(显示时用6位64进制的字符 power(64,6)=power(2,36)>power(2,32))
rfile#占用10 位,
(显示时用3位64进制的字符 power(64,3)=power(2,18)>power(2,10))
block_number占22位,
(显示时用6位64进制的字符 power(64,6)=power(2,36)>power(2,22))
row#占用16位
(显示时用3位64进制的字符 power(64,3)=power(2,18)>power(2,16))
由此:
32bit的objects number,每个数据库最多有4G个对象
10bit的rfile#,由于rfile#占用了10位,因此每个表空间最多有1022个文件(2个预留)
22bit的block number,每个文件最多有4M个BLOCK
16bit的row number,每个BLOCK最多有64K个ROWS。
rowid在索引中是真实存储的,但在索引(gloab index?有待确定)中rowid没有必要存储data_object_id,所以索引中rowid为80-32=48位,采用12位16进制的字符来表示。
btw:在索引中键值和rowid是成对出现的,也就是说一个键值有多少重复的记录,它就将在索引叶节点中出现多少次每次都对应一个rowid,只不过键值相同的记录是顺序出现的。
以下节选自对索引的dump文件(alter system dump datafile xxx block xxx;)
row#0[8019] flag: ------, lock: 0, len=17
col 0; len 7; (7): 41 4e 41 4c 59 53 54 ---键值
col 1; len 6; (6): 01 00 00 20 00 07 ---无data_object_id ,16进制12位占6个字节
row#1[8002] flag: ------, lock: 0, len=17
col 0; len 7; (7): 41 4e 41 4c 59 53 54
col 1; len 6; (6): 01 00 00 20 00 0c
row#2[7987] flag: ------, lock: 0, len=15
col 0; len 5; (5): 43 4c 45 52 4b
col 1; len 6; (6): 01 00 00 20 00 00
row#3[7972] flag: ------, lock: 0, len=15
col 0; len 5; (5): 43 4c 45 52 4b
col 1; len 6; (6): 01 00 00 20 00 0a
row#4[7957] flag: ------, lock: 0, len=15
col 0; len 5; (5): 43 4c 45 52 4b
col 1; len 6; (6): 01 00 00 20 00 0b
row#5[7942] flag: ------, lock: 0, len=15
col 0; len 5; (5): 43 4c 45 52 4b
col 1; len 6; (6): 01 00 00 20 00 0d
rowid操作package:dbms_rowid ,相关过程、函数使用方法可以通过帮助获得。 |
|