Oracle資料庫開發——瞭解rowid
關於rowid,這個偽列具體有什麼作用呢?
rowid是一個64進位制數,一共18位,
其中前6表示資料段的編號,接下來的3位表示相對檔案編號,再下來的6位是塊編號,最後3位是相對塊的行編號。
即:
OOOOOO(Data Object Number) FFF(relative file number相對錶空間的檔案編號) BBBBBB(Block Number) RRR(Row number)
注意:相對檔案編號和絕對檔案編號的區別
SQL> select t.FILE_ID,t.RELATIVE_FNO from dba_data_files t;
FILE_ID RELATIVE_FNO
---------- ------------
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
其中 FILE_ID 絕對檔案編號,RELATIVE_FNO 相對檔案編號
當資料庫裡面的資料檔案小於等於1022的時候,絕對檔案編號 和 相對檔案編號相等。
這64進位制是怎麼樣來表示的:
A~Z 表示 0到25
a~z 表示 26到51
0~9 表示 52到61
+ 表示 62
/ 表示 63
這樣0~63就全了~
來驗證下:
SQL> select rowid,g.* from goods g;
ROWID G_ID G_NAME G_PRICE G_LEVELS
------------------ --------------------------------------- ---------- ------------ ----------
AAADtcAAEAAAACnAAA 1 LoL 88.00 低價
可以看到該條資料:
AAADtc(資料段編號)AAE(相對檔案編號) AAAACn(塊編號) AAA(塊中行號)
SQL> select OWNER,OBJECT_NAME,OBJECT_ID,DATA_OBJECT_ID from dba_objects where owner = 'ZHANGBIN' and object_name ='GOODS';
OWNER OBJECT_NAME OBJECT_ID DATA_OBJECT_ID
------------------------------ --------------------- ---------- --------------
ZHANGBIN GOODS 15196 15196
可以看到表goods表的資料段編號為 15196
計算一下: AAADtc =? 15196
SQL> select 0*power(64,5)+0*power(64,4)+0*power(64,3)+3*power(64,2)+45*64+28 from dual;
0*POWER(64,5)+0*POWER(64,4)+0*
------------------------------
15196
結果是相等的
同理可以計算出
AAE(相對檔案編號)=4
AAAACn(塊編號)= 2*64 + 39 = 167
AAA(塊中行號)= 0
那麼,這說明goods表中的這行資料,應該在4號檔案的第167個塊上?驗證一下。
SQL> select * from dba_extents where owner = 'ZHANGBIN' and segment_name = 'GOODS';
OWNER SEGMENT_NAME PARTITION_NAME SEGMENT_TYPE TABLESPACE_NAME EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS RELATIVE_FNO
--------- ------------- --------------- ------------ --------------- ---------- ---------- ---------- ---------- ---------- ------------
ZHANGBIN GOODS TABLE USERS 0 4 160 65536 8 4
可以看到 FILE_ID = 4,BLOCK_ID = 160,BLOCKS = 8
說明 4號檔案,從第160塊開始,連續8個塊屬於表GOODS的資料段,即塊號位160 ~ 167屬於GOODS的資料段
我們計算出來的塊是167,即驗證了goods表中這行資料,應該在4號檔案的第167個塊上
又由於AAA(塊中行號)= 0,該條資料存在 4號檔案的第167個塊上的第一行 !
以上是我們自己手工來裝換計算
=====================================================================
Oracle中提供了計算rowid相關值的包 dbms_rowid
SQL> select
2 dbms_rowid.rowid_object('AAADtcAAEAAAACnAAA') as data_object_id
3 ,dbms_rowid.rowid_relative_fno('AAADtcAAEAAAACnAAA') as relative_fno
4 ,dbms_rowid.rowid_block_number('AAADtcAAEAAAACnAAA') as block_number
5 ,dbms_rowid.rowid_row_number('AAADtcAAEAAAACnAAA') as row_number
6 from dual;
DATA_OBJECT_ID RELATIVE_FNO BLOCK_NUMBER ROW_NUMBER
-------------- ------------ ------------ ----------
15196 4 167 0
rowid是一個64進位制數,一共18位,
其中前6表示資料段的編號,接下來的3位表示相對檔案編號,再下來的6位是塊編號,最後3位是相對塊的行編號。
即:
OOOOOO(Data Object Number) FFF(relative file number相對錶空間的檔案編號) BBBBBB(Block Number) RRR(Row number)
注意:相對檔案編號和絕對檔案編號的區別
SQL> select t.FILE_ID,t.RELATIVE_FNO from dba_data_files t;
FILE_ID RELATIVE_FNO
---------- ------------
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
其中 FILE_ID 絕對檔案編號,RELATIVE_FNO 相對檔案編號
當資料庫裡面的資料檔案小於等於1022的時候,絕對檔案編號 和 相對檔案編號相等。
這64進位制是怎麼樣來表示的:
A~Z 表示 0到25
a~z 表示 26到51
0~9 表示 52到61
+ 表示 62
/ 表示 63
這樣0~63就全了~
來驗證下:
SQL> select rowid,g.* from goods g;
ROWID G_ID G_NAME G_PRICE G_LEVELS
------------------ --------------------------------------- ---------- ------------ ----------
AAADtcAAEAAAACnAAA 1 LoL 88.00 低價
可以看到該條資料:
AAADtc(資料段編號)AAE(相對檔案編號) AAAACn(塊編號) AAA(塊中行號)
SQL> select OWNER,OBJECT_NAME,OBJECT_ID,DATA_OBJECT_ID from dba_objects where owner = 'ZHANGBIN' and object_name ='GOODS';
OWNER OBJECT_NAME OBJECT_ID DATA_OBJECT_ID
------------------------------ --------------------- ---------- --------------
ZHANGBIN GOODS 15196 15196
可以看到表goods表的資料段編號為 15196
計算一下: AAADtc =? 15196
SQL> select 0*power(64,5)+0*power(64,4)+0*power(64,3)+3*power(64,2)+45*64+28 from dual;
0*POWER(64,5)+0*POWER(64,4)+0*
------------------------------
15196
結果是相等的
同理可以計算出
AAE(相對檔案編號)=4
AAAACn(塊編號)= 2*64 + 39 = 167
AAA(塊中行號)= 0
那麼,這說明goods表中的這行資料,應該在4號檔案的第167個塊上?驗證一下。
SQL> select * from dba_extents where owner = 'ZHANGBIN' and segment_name = 'GOODS';
OWNER SEGMENT_NAME PARTITION_NAME SEGMENT_TYPE TABLESPACE_NAME EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS RELATIVE_FNO
--------- ------------- --------------- ------------ --------------- ---------- ---------- ---------- ---------- ---------- ------------
ZHANGBIN GOODS TABLE USERS 0 4 160 65536 8 4
可以看到 FILE_ID = 4,BLOCK_ID = 160,BLOCKS = 8
說明 4號檔案,從第160塊開始,連續8個塊屬於表GOODS的資料段,即塊號位160 ~ 167屬於GOODS的資料段
我們計算出來的塊是167,即驗證了goods表中這行資料,應該在4號檔案的第167個塊上
又由於AAA(塊中行號)= 0,該條資料存在 4號檔案的第167個塊上的第一行 !
以上是我們自己手工來裝換計算
=====================================================================
Oracle中提供了計算rowid相關值的包 dbms_rowid
SQL> select
2 dbms_rowid.rowid_object('AAADtcAAEAAAACnAAA') as data_object_id
3 ,dbms_rowid.rowid_relative_fno('AAADtcAAEAAAACnAAA') as relative_fno
4 ,dbms_rowid.rowid_block_number('AAADtcAAEAAAACnAAA') as block_number
5 ,dbms_rowid.rowid_row_number('AAADtcAAEAAAACnAAA') as row_number
6 from dual;
DATA_OBJECT_ID RELATIVE_FNO BLOCK_NUMBER ROW_NUMBER
-------------- ------------ ------------ ----------
15196 4 167 0
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28929558/viewspace-1150766/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle資料庫開發——瞭解索引Oracle資料庫索引
- Oracle資料庫開發——瞭解分割槽表Oracle資料庫
- 瞭解oracle資料庫體系結構(3)Oracle資料庫
- 瞭解oracle資料庫體系結構(2)Oracle資料庫
- 瞭解oracle資料庫體系結構(1)Oracle資料庫
- 瞭解Oracle資料字典Oracle
- Oracle資料庫開發——序列Oracle資料庫
- 瞭解圖形資料庫資料庫
- 深入瞭解Oracle資料字典Oracle
- Oracle資料庫開發——表(概念)Oracle資料庫
- Oracle資料庫開發指南(二)Oracle資料庫
- ORACLE資料庫開發經驗Oracle資料庫
- SQLite資料庫中rowid使用SQLite資料庫
- oracle rowid詳解Oracle
- Oracle rowid 詳解Oracle
- 瞭解資料庫連線池資料庫
- 瞭解MySQl資料庫目錄MySql資料庫
- 深入瞭解Oracle資料字典(zt)Oracle
- Oracle資料庫開發——臨時表Oracle資料庫
- Oracle資料庫開發——同義詞Oracle資料庫
- Oracle資料庫開發指南(原創)Oracle資料庫
- Oracle資料庫開發——深入索引結構Oracle資料庫索引
- ORACLE資料庫開發經驗總結Oracle資料庫
- 帶你快速瞭解Oracle資料庫提供的恢復機制Oracle資料庫
- Oracle資料庫開發——表(資料完整性約束)Oracle資料庫
- Oracle資料庫發展Oracle資料庫
- 如何快速的瞭解某種資料庫資料庫
- 資料庫複製技術全面瞭解資料庫
- 瞭解這一點輕鬆解決Oracle資料庫系統報錯問題Oracle資料庫
- 【ROWID】Oracle rowid說明Oracle
- 一篇文章瞭解Redis資料庫Redis資料庫
- 帶你瞭解資料庫中JOIN的用法資料庫
- 帶你瞭解資料庫中group by的用法資料庫
- oracle資料庫開發的一些經驗Oracle資料庫
- 學習大資料必須瞭解的大資料開發課程大綱大資料
- 還不瞭解資料庫?Smartbi一文帶你入門資料庫!資料庫
- oracle rowidOracle
- 【Oracle-資料庫概念】-Oracle checkpoint詳解Oracle資料庫