|
Re: Oracle基本数据类型存储格式浅析(四)——ROWID类型(一)
最初由 yangtingkun 发布
[B]
SQL> select row_id, dump(row_id, 16) dump_rowid from test_rowid;
ROW_ID DUMP_ROWID
------------------ -------------------------------------------------
AAABnRAAGAAAACWAAA Typ=69 Len=10: 0,0,19,d1,1,80,0,96,0,0
前4位表示ROWID的前6位,也就是DATA_OBJECT_ID信息。数据以数值的格式保存。
后面4位比较特殊,是数据文件号和BLOCK数的“和”值构成。
数据文件的数值乘64后保存在5、6位上。
SQL> select to_number('0180', 'xxxx') from dual;
TO_NUMBER('0180','XXXX')
------------------------
384
SQL> select 6*64 from dual;
6*64
------------
384
同时,6位BLOCK的值,也保存在这4位上,并与数据文件转存结果相加。仍然是以数字格式存放。
SQL> select to_number('96', 'xxx') from dual;
TO_NUMBER('96','XXX')
---------------------
150
SQL> select 2*64 + 22 from dual;
2*64+22
----------
150
由于采用两位保存数据文件的值,且最小单位是64,因此,ROWID中可以保存的数据文件数是1024,超过1024会造成ROWID的重复。
SQL> select 256*256/64 from dual;
256*256/64
----------
1024
由于BLOCK的值和数据文件共用这4位,因此BLOCK的第3位最大值应小于64,这样才能保证ROWID的不重复。因此BLOCK值的最大值应该是4194304。
SQL> select 64*256*256 from dual;
64*256*256
----------
4194304
最后两位保存BLOCK中记录的值。这个值的最大值是65536。
SQL> select 256*256 from dual;
256*256
----------
65536
出自:http://blog.itpub.net/post/468/11046 [/B]
想請教一下﹕
您 上面所說的﹕
"后面4位比较特殊,是数据文件号和BLOCK数的“和”值构成。"
是什么意思﹖我不是能理解這個 "和" 怎么理解。 在我看來
file id 與 block id 分別是在存儲在 各自的兩位上面。
SQL> select row_id, dump(row_id, 16) dump_rowid from test_rowid;
ROW_ID DUMP_ROWID
------------------ -------------------------------------------------
AAABnRAAGAAAACWAAA Typ=69 Len=10: 0,0,19,d1,1,80,0,96,0,0
如您所列舉的﹕
file id :
SQL> select to_number('0180', 'xxxx')/64 from dual;
TO_NUMBER('0180','XXXX')/64
------------------------
6
這個就是 相對文件 ID 了。
而
block id ﹕
SQL> select to_number('96', 'xxx') from dual;
TO_NUMBER('96','XXX')
---------------------
150
就是所在的 塊 id 了。
還有一點沒有清楚﹐為何在算 文件id 時要 除以 /64 以得到文件號才是我們想要的文件。而在算 block 時卻沒有這樣的算。是否這就是您所說的與 文件與塊 "和" 一起存儲的原因﹑
謝謝! |
|