ROWID的格式 | ||||
rowid | OOOOOO | FFF | BBBBBB | RRR |
说明 | 数据对象号 | 相对文件号 | 数据块号 | 行号 |
上述表格是Oracle 9i及以上版本数据库中的rowid格式: 6位对象号+3位相对文件号+6位数据块号+3位行号,是一个18位的64进制值。这个18位的64进制值在数据库内却是以10个bytes合计80个bit的二进制数存放的,和我们直接看到的结果有所区别。 这里的64进制和10进制的对应编码如下:
其中, 6位的对象号在数据库中是用32位二进制来存放的,也就意味着一一个oracle数据库中最多可以有232个对象,即4G个对象; 3位的相对文件号在数据库中是用10位二进制来存放的,也就意味著-一个表空间中最多可以容纳210=1024去掉全0和全1个数据文件 , 即1022个数据文件; 6位的数据块号用22位二进制来存放的,也就意味着-个数据文件最多可以包含222=4M个数据块; 3位的行号在数据库中是用1 6位二进制来存放的,也就意味著一一个数据块上最多可以容纳21 6-65536行记录。
对于大文件表空间下的rowid有如下特定的格式,这有别于小文件表空间下的rowid格式: 000000BBBBBBBBBRRR 即,6位的数据库对象号+9位的数据块号+3位的行号,同样也是以18位的64进制值来表示80位的二进制数。只不过,在这里少了相对文件号,其中6位的数据库对象号用32位的二进制数来存放(即-一个数据库最多可以拥有232=4G个数据块对象),9位的数据块号同样用32位的二进制数来存放(即一个大文件表空间可以拥有232个数据块儿),最后3位的行号占用剩余的16位的二进制数,正好占满80位。
大文件相对文件号为0,因为大文件的表的rowid格式中根本就不存在相对文件号的信息,最本质的原因是大文件表空间下永远只能有且仅有1个数据文件。也就没有相对文件号的概念了。同时,对于大文件的表空间,如果数据块大小为32K的话,那 我们可以在查询列表中,把rowid伪列当做普通的字段来查询。 我们还可以通过数据库提供给我们的工具包来获取该信息: SQL> select rowid, 2 dbms _rowid.rowid_ _bject(rowid) object id,3 dbms, _kowid.rowid_ relative_ fnorowid) file_ id, 4 dbms_ rowid.rowid. bock _number(rowid) block_ jd ,5 dbms_ rowidrowid_ row_ number(rowid) num , 6 rowidtochar(rowid) from employees where employee_ jd=1007; ROWID OBJECT_ID FILEI _ID BLOCK_ ID NUM ROWIDTOCHAR(ROWID) AAAR5pAAF AAAADPAAA 73321 5 207 : 0 AAAR5pAAFAAAADPAAA |