1 ROWID的特性
(1)rowid是一個偽列,是用來確保表中行的唯一性,它并不能指示出行的物理位置,但可以用來定位行。
(2)rowid是存儲在索引中的一組既定的值(當(dāng)行確定后)。我們可以像表中普通的列一樣將它選出來。
(3)利用rowid是訪問表中一行的最快方式。
(4)rowid需要10個字節(jié)來存儲,顯示為18位的字符串。
2 ROWID的結(jié)構(gòu)
rowid的組成結(jié)構(gòu)為:
data object number(6位字符串) relative file number(3位字符串) block number(6位字符串) row number(3位字符串),如:AAAADeAABAAAAZSAAA
64編碼的物理地址,編碼字符是A-Z, a-z, 0-9, +,and/.
由4部分組成OOOOOOFFFBBBBBBRRR (obj#file#block#row#)
OOOOOO -–data object number
FFF –-表空間相對的數(shù)據(jù)文件號
BBBBBB –-塊號
RRR ---行號
我們可以借助oracle提供的包dbms_rowid,來對rowid進(jìn)行解析從而獲取關(guān)于行的相關(guān)信息,這里你可以選擇任何一個數(shù)據(jù)庫中的表,如下所示:
SQL> get c:\rowid.sql
1 select
2 rowid,
3 dbms_rowid.rowid_object(rowid) obj_id,
4 dbms_rowid.rowid_relative_fno(rowid) df#,
5 dbms_rowid.rowid_block_number(rowid) blknum,
6 dbms_rowid.rowid_row_number(rowid) rowno
7* from scott.emp
SQL> r
1 select
2 rowid,
3 dbms_rowid.rowid_object(rowid) obj_id,
4 dbms_rowid.rowid_relative_fno(rowid) df#,
5 dbms_rowid.rowid_block_number(rowid) blknum,
6 dbms_rowid.rowid_row_number(rowid) rowno
7* from scott.emp
ROWID OBJ_ID DF# BLKNUM ROWNO
------------------ ---------- ---------- ---------- ----------
AAAL+ZAAEAAAAAdAAA 49049 4 29 0
AAAL+ZAAEAAAAAdAAB 49049 4 29 1
AAAL+ZAAEAAAAAdAAC 49049 4 29 2
AAAL+ZAAEAAAAAdAAD 49049 4 29 3
AAAL+ZAAEAAAAAdAAE 49049 4 29 4
AAAL+ZAAEAAAAAdAAF 49049 4 29 5
AAAL+ZAAEAAAAAdAAG 49049 4 29 6
AAAL+ZAAEAAAAAdAAH 49049 4 29 7
AAAL+ZAAEAAAAAdAAI 49049 4 29 8
AAAL+ZAAEAAAAAdAAJ 49049 4 29 9
AAAL+ZAAEAAAAAdAAK 49049 4 29 10
AAAL+ZAAEAAAAAdAAL 49049 4 29 11
AAAL+ZAAEAAAAAdAAM 49049 4 29 12
AAAL+ZAAEAAAAAdAAN 49049 4 29 13
14 rows selected.
當(dāng)如下情況發(fā)生時,rowid將發(fā)生改變:
(1)對一個表做表空間的移動后
(2)對一個表進(jìn)行了EXP/IMP