ROWID 是一個類似於rownum的偽列,用於定位元據庫中一條記錄的一個相對唯一地址值。通常情況下,該值在該行資料插入到資料庫表時即
被確定且唯一。而對於聚簇表,由於聚簇特性,不同表上的記錄由於儲存在相同的簇上,因此會擁有相同的ROWID。資料庫的大多數操作都是通
過ROWID來完成的,而且使用ROWID來進行單記錄定位速度是最快的。下面將給出ROWID的相關描述。
一、ROWID的特性組成及用途
1、特性
相對唯一性(聚簇表上不唯一)
一旦確定,不可隨意更改
使用10個位元組儲存(擴充rowid),顯示為18位的字串
特殊情況下,ROWID會發生變化(如下列情形)
表的匯入匯出操作
alter table tab_name move
alter table tab_name shrink space
flashback table tab_name
拆分分區表
分區表上更新一個值後記錄被移入到新分區
合并兩個分區
2、組成(擴充ROWID)
資料庫物件的對象編號
資料庫物件所在檔案的檔案編號
資料庫物件上塊的編號
塊上的行編號(起始值為0)
3、用途
快速定位單行記錄
展示行在表上如何儲存
表上的一行的唯一識別碼
用作資料類型 column_name rowid
4、限制rowid,擴充rowid
限制rowid用於早期Oracle版本(Oracle 8 以前),rowid由file#+block#+row#組成,佔用6個bytes的空間
擴充rowid,由data_object_id#+rfile#+block#+row#組成,佔用10個bytes的空間
二、ROWID的格式
SQL> select rowid,t.* from dept t where t.deptno=10;
ROWID DEPTNO DNAME LOC
------------------ ---------- -------------- -------------
AAAO0fAAFAAAAlmAAA 10 ACCOUNTING NEW YORK /*
AAAO0f - AAF - AAAAlm - AAA
對象號(6個字元) 檔案號(3個字元) 塊號(6個字元) 行號(3個字元) */
三、查看ROWID資訊及相關示範
1、查看堆表上rowid及擷取rowid資訊
SQL> select rowid,dept.* from dept ; -->查看錶dept中所有記錄的rowid
ROWID DEPTNO DNAME LOC
------------------ ---------- -------------- -------------
AAAO0fAAFAAAAlmAAA 10 ACCOUNTING NEW YORK
AAAO0fAAFAAAAlmAAB 20 RESEARCH DALLAS
AAAO0fAAFAAAAlmAAC 30 SALES CHICAGO
AAAO0fAAFAAAAlmAAD 40 OPERATIONS BOSTON
SQL> select object_name,object_id from dba_objects where object_name='DEPT' and owner='SCOTT';-->查看對象id
OBJECT_NAME OBJECT_ID
-------------------- ----------
DEPT 60703
SQL> select dbms_rowid.rowid_object(rowid) object_id, -->使用dbms_rowid包獲得rowid的十進位資訊
2 dbms_rowid.rowid_relative_fno(rowid) file_id,
3 dbms_rowid.rowid_block_number(rowid) block_id,
4 dbms_rowid.rowid_row_number(rowid) num
5 from dept;
OBJECT_ID FILE_ID BLOCK_ID NUM -->此處可以看到對應的對象號,檔案號,塊號以及行號
---------- ---------- ---------- ----------
60703 5 2406 0
60703 5 2406 1
60703 5 2406 2
60703 5 2406 3
SQL> col file_name format a50
SQL> select file_id,file_name from dba_data_files where file_id=5; -->通過檔案id獲得對象所在資料檔案的位置
FILE_ID FILE_NAME
---------- --------------------------------------------------
5 /u02/database/CNMMBO/oradata/CNMMBO_system_tbl.dbf
SQL> select rowid, -->這個查詢按照rowid的定義格式進行分離rowid
2 substr(rowid,1,6) "object",
3 substr(rowid,7,3) "file",
4 substr(rowid,10,6) "block",
5 substr(rowid,16,3) "row"
6 from dept;
ROWID object file block row
------------------ ------------------ --------- ------------------ ---------
AAAO0fAAFAAAAlmAAA AAAO0f AAF AAAAlm AAA
AAAO0fAAFAAAAlmAAB AAAO0f AAF AAAAlm AAB
AAAO0fAAFAAAAlmAAC AAAO0f AAF AAAAlm AAC
AAAO0fAAFAAAAlmAAD AAAO0f AAF AAAAlm AAD
查看本欄目更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/