Oracle中ROWID詳解


  oracle數據庫的表中的每一行數據都有一個唯一的標識符,或者稱為rowid,在oracle內部通常就是使用它來訪問數據的。rowid需要 10個字節的存儲空間,並用18個字符來顯示。該值表明了該行在oracle數據庫中的物理具體位置。可以在一個查詢中使用rowid來表明查詢結果中包含該值。

      保存rowid需要10個字節或者是80個位二進制位。這80個二進制位分別是:
      1. 數據對象編號,表明此行所屬的數據庫對象的編號,每個數據對象在數據庫建立的時候都被唯一分配一個編號,並且此編號唯一。數據對象編號占用大約32位。
      2. 對應文件編號,表明該行所在文件的編號,表空間的每一個文件標號都是唯一的。文件編號所占用的位置是10位。
      3. 塊編號,表明改行所在文件的塊的位置塊編號需要22位。
      4. 行編號,表明該行在行目錄中的具體位置行編號需要16位。
這樣加起來就是80位。

Oracle的物理擴展ROWID有18位,每位采用64位編碼,分別用A~Z、a~z、0~9、+、/共64個字符表示。A表示0,B表示1,……Z表示25,a表示26,……z表示51,0表示52,……,9表示61,+表示62,/表示63。

例如:

select rowid,empid from scott.emp;

將會得到結果:

 select rowid,empno from scott.emp;

 

ROWID EMPNO

------------------ ----------

AAAR3sAAEAAAACXAAA 7369

AAAR3sAAEAAAACXAAB 7499

AAAR3sAAEAAAACXAAC 7521

AAAR3sAAEAAAACXAAD 7566

AAAR3sAAEAAAACXAAE 7654

AAAR3sAAEAAAACXAAF 7698

AAAR3sAAEAAAACXAAG 7782

AAAR3sAAEAAAACXAAH 7788

AAAR3sAAEAAAACXAAI 7839

AAAR3sAAEAAAACXAAJ 7844

AAAR3sAAEAAAACXAAK 7876

AAAR3sAAEAAAACXAAL 7900

AAAR3sAAEAAAACXAAM 7902

AAAR3sAAEAAAACXAAN 7934

已選擇14行。

 

這里的AAAR3s是數據庫對象編號,AAE是文件標號,AAAACX是塊編號,最后三位(empno = 7934時為AAN)是行編號。

據下面的查詢結果:

SQL> select FILE_ID as fid,FILE_NAME  from dba_data_files where TABLESPACE_NAME='USERS' ;

 

       FID FILE_NAME

---------- ---------------------------------------------

4 D:\APP\WANGXUWEI\ORADATA\ORCL\USERS01.DBF

 我們可看出FILE_ID=4,就是ROWID中AAE。

 

 通過dbms_rowid包,可以直接得到具體的rowid包含的信息:

SQL> select dbms_rowid.rowid_object(rowid) object_id,dbms_rowid.rowid_relative_fno(rowid) file_id,dbms_rowid.rowid_block_number(rowid) block_id,dbms_rowid.rowid_row_number(rowid) row_number from emp;

 

 OBJECT_ID    FILE_ID BLOCK_ID ROW_NUMBER

---------- ---------- ---------- ----------

     73196    4     151  0

     73196    4     151  1

     73196    4     151  2

     73196    4     151  3

     73196    4     151  4

     73196    4     151  5

     73196    4     151  6

     73196    4     151  7

     73196    4     151  8

     73196    4     151  9

     73196    4     151 10

 

 OBJECT_ID    FILE_ID BLOCK_ID ROW_NUMBER

---------- ---------- ---------- ----------

     73196    4     151 11

     73196    4     151 12

     73196    4     151 13

 

已選擇14行。

我們可驗算如下:73196=AAAR3s=17×64×64+55×64+44 

                            151=AAAACX=2×64+23
最后一條記錄編號AAN =13

通過dbms_rowid包,還可以查詢到表或記錄所在的文件
SQL> select file_name, file_id from dba_data_files where file_id in  (select distinct dbms_rowid.rowid_relative_fno(rowid) from scott.emp);

FILE_NAME FILE_ID
--------------------------------------------- ----------
D:\APP\WANGXUWEI\ORADATA\ORCL\USERS01.DBF                      4

 

使用describle(或簡寫為desc)命令查看表結構時,輸出結果中是不能看到rowid這里一列的,這是因為這一列只在數據庫內部使用,rowid通常被稱為一個偽列。在某些oracle數據庫操作的IDE(例如golden)中使用這些工具自帶的數據編輯功能時,必須指定rowid列才能完成,例如如果想選擇

scott.emp的數據后進行手工修改,則必須使
select rowid,t.* from scott.emp t;
而不能直接寫成
select * from emp;

 

 

原文鏈接:https://blog.csdn.net/wxwpxh/article/details/50532464


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM