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 |
?
?
?
?