Rowid 字段類型:
Rowid 是一行數據的一個唯一標識。
ROWID 是數據的詳細地址,通過 rowid,oracle 可以快速的定位某行具體的數據的位置。 ROWID 可以分為物理 rowid 和邏輯 rowid 兩種。普通的堆表中的 rowid 是物理 rowid,索引組織表(IOT)的 rowid 是邏輯 rowid。oracle 提供了一種 urowid 的數據類型,同時支持物理和邏輯 rowid。本文主要關注物理 rowid。
物理 rowid 又分為擴展 rowid(extended rowid)和限制 rowid(restricted rowid)兩種格式。限制 rowid 主要是 oracle7 以前的 rowid 格式,現在已經不再使用,保留該類型只是為了兼容性。 所下面來做個例子,來幫助我們認識它:
SQL> create table test(id number,name varchar2(10)); Table created.
插入幾條數據
SQL> insert into test values(0,'orcl');
SQL> insert into test values(1,'orcl');
SQL> insert into test values(2,'orcl');
SQL> insert into test values(3,'orcl');
查看表內容
SQL> select rowid,id,name from test; ROWID ID NAME ------------------ ---------- ---------- AAAV5DAAOAAAACWAAA 0 orcl AAAV5DAAOAAAACWAAB 1 orcl AAAV5DAAOAAAACWAAC 3 orcl AAAV5DAAOAAAACWAAD 2 orcl
Rowid 是一個隱藏的字段,每一張表都存在,默認查看一張數據的時候不會出現。只有特意加上 rowid 字段才會出現。
Rowid 的結構:
Rowid 的顯示形式
我們從 rowid 偽列里 select 出來的 rowid 是基於 base64 編碼,一共有 18 位,分為 4 部分:
OOOOOOFFFBBBBBBRRR
現在的格式是 9i 及以后版本的格式。
前 6 位( OOOOOO )為數據對象 ID,一張表、一個所引都是一個數據對象,oracle 都會分配給他們一個唯一的數據對象。
緊跟的 3 位( FFF )為相對的文件 ID,我們知道表空間是由不同的文件組成,對象存儲的某個文件里,每個文件會對應一個 ID 號
再接着的 6 位( BBBBBB )為塊 ID ,文件是由塊組成的,每個塊也有一個唯一的 ID 編號。
最后 3 位( RRR )為行 ID ,每個塊又可划分成行,每個行也有一個 ID 號。
可以根據64位編碼表轉義到具體的數據對象ID、文件ID、塊ID、行ID。
select dbms_rowid.rowid_object(rowid) obj_id,
dbms_rowid.rowid_relative_fno(rowid) rfile_id,
dbms_rowid.rowid_block_number(rowid) block_id,
dbms_rowid.rowid_row_number(rowid) row_id,
dbms_rowid.rowid_to_absolute_fno(rowid,'TEST','ITPUX') file#
from test.itpux;
SQL> select dbms_rowid.rowid_object(rowid) obj_id,
2 dbms_rowid.rowid_relative_fno(rowid) rfile_id,
3 dbms_rowid.rowid_block_number(rowid) block_id,
4 dbms_rowid.rowid_row_number(rowid) row_id,
5 dbms_rowid.rowid_to_absolute_fno(rowid,'TEST','TEST') file#
6 from test.test;
OBJ_ID RFILE_ID BLOCK_ID ROW_ID FILE#
---------- ---------- ---------- ---------- ----------
89667 14 150 0 14
89667 14 150 1 14
89667 14 150 2 14
89667 14 150 3 14
