Oracle redo解析之-四、rowid的計算

對rowid的理解

  rowid是數據庫的一個僞列,在創建表的時候Oracle會自動爲每一個表創建ROWID列。僞列實際上不存儲在表中,能夠從這些僞列中查詢值,但不能插入、更新或刪除。
  rowid是用來惟一標識一行記錄的,是存儲每條記錄的實際物理地址。數據庫

查詢某條記錄的rowid值

SQL> select ROWID from user_test where rownum<3;

ROWID
------------------
AAAQObAAFAAAACDAAA
AAAQObAAFAAAACFAAA

rowid的格式以下:
1. 數據對象編號: AAAQOb, data_obj#,即obj$
2. 相對文件編號: AAF, file#
3. 塊編號: AAAACD, block#
4. 行編號: AAA, slot
複製代碼

計算具體的dataobj#, file#, block#, slot

圖片 1.png

rowid是base64編碼,用A-Z,a-z, 0-9,+,/共64個字符來表示,A表示0,B表示1等等。
	則:	
	data_obj#=AAAQOb=0*64^5 + 0*64^4 + 0*64^3 + 16*64^2 + 14*64^1 + 27*64^0 = 66459
	file#=AAF=0*64^2 + 0*64^1 + 5*64^0 = 5
	block#=AAAACD=2*64^1 + 3*64^0 = 128
	slot=AAA = 0
複製代碼

根據data_obj#, file#, block#, slot計算rowid

  實際上就是將十進制數轉化成64進制,固然從二進制轉換比較簡單。
  將二進制數從右往左,6位一組,而後將這6位二進制轉成十進制,而後替換成base64的字符便可。bash

例:
	dataobj#=66444=1 00000011 10001100 = 010000 001110 001100 = 16 14 12 = Q O M = AAAQOM(補齊6位)
	file#=1 = AAB
	block#=70321=1 00010010 10110001 = 010001 001010 110001 = 17 10 49 = R K x = AAARKx
	slot=0 = AAA
則:rowid=AAAQOMAABAAARKxAAA
複製代碼

SQL查詢出data_obj#,file#,block#,slot的值

SQL> select dbms_rowid.rowid_object(rowid) object_id,
  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 user_test;

 OBJECT_ID    FILE_ID	BLOCK_ID	NUM
---------- ---------- ---------- ----------
     66459	    5	     131	  0
     66459	    5	     133	  0
複製代碼

#總結   根據data_obj#肯定數據保存的數據段,根據file#肯定數據所在的文件,根據block#肯定數據保存在文件的哪裏塊,根據slot肯定數據保存在塊中的哪一行,所以根據rowid能夠具體定位數據的位置。對數據庫中記錄行的最快檢索操做就是經過rowid來進行查找的。ui

相關文章
相關標籤/搜索