Oracle ROWID-2

尛樣兒發表於2010-07-17

轉載自:http://www.itpub.net/viewthread.php?tid=1095691&highlight=rowid

[一週一帖之五]Rowid簡單總結

Rowid簡單總結

本文是看到了精華帖中的warehouse的“rowed的一點總結”後寫的一點總結,主要是自己歸納的一個過程。原來一直弄不明白顯示rowid的18位64進位制和10byte之間的關係,看了此文後總算有點理解了。感謝warehouse!
Rowid分類:物理rowid,邏輯rowid
物理rowid:extended rowid,restricted rowid
restricted rowid是oracle7 採用的,從oracle8開始都是使用extended rowid,主要是因為資料量的膨脹原來的rowid不夠用了。
邏輯rowid出現有兩個原因:iot表的記錄物理上可能會發生變化,如果用物理rowid就不適用了;其次是oracle資料庫可能會引用一些其他資料庫(db2等)的資料,對於這部分資料也只能用邏輯rowid。邏輯rowid是基於primary key的所以iot表必須有pk。

顯示:18位64進位制字元 
OOOOOO FFF BBBBBB RRR  對應  data_object_id, rfile#, block#, Rows
顯示出來的是64進位制數,oracle在設計rowid時用A~Z表示0-25,用a~z表示26-51,用0~9表示52-61,用+表示62,用/表示63
例如:AAACdcAABAAAHCKAAA
AAACdc   = 2*power(64,2)+29*64+28   OOOOOO
AAB       = 2                           FFF
AAAHCK   = 7*power(64,2)+2*64+10    BBBBBB
AAA       =0                            RRR

內部處理:
Rowid是偽列,在資料庫中是不進行儲存的(某些特殊情況除外例如索引中)而是在獲取時根據儲存位置構造出來的。
sql>SELECT VSIZE(ROWID) FROM SCOTT.EMP;
    10
Rowid在顯示上採用的是64位編碼,但是內部處理上是透過10個位元組即80位來進行的。
其中data_object_id佔用32 位 
(顯示時用6位64進位制的字元 power(64,6)=power(2,36)>power(2,32))
rfile#佔用10 位,
(顯示時用3位64進位制的字元 power(64,3)=power(2,18)>power(2,10))
block_number佔22位,
(顯示時用6位64進位制的字元 power(64,6)=power(2,36)>power(2,22))
row#佔用16位
(顯示時用3位64進位制的字元 power(64,3)=power(2,18)>power(2,16))
由此:
32bit的objects number,每個資料庫最多有4G個物件
10bit的rfile#,由於rfile#佔用了10位,因此每個表空間最多有1022個檔案(2個預留)
22bit的block number,每個檔案最多有4M個BLOCK
16bit的row number,每個BLOCK最多有64K個ROWS。
rowid在索引中是真實儲存的,但在索引(gloab index?有待確定)中rowid沒有必要儲存data_object_id,所以索引中rowid為80-32=48位,採用12位16進位制的字元來表示。
btw:在索引中鍵值和rowid是成對出現的,也就是說一個鍵值有多少重複的記錄,它就將在索引葉節點中出現多少次每次都對應一個rowid,只不過鍵值相同的記錄是順序出現的。
以下節選自對索引的dump檔案(alter system dump datafile xxx block xxx;)
row#0[8019] flag: ------, lock: 0, len=17
col 0; len 7; (7):  41 4e 41 4c 59 53 54  ---鍵值
col 1; len 6; (6):  01 00 00 20 00 07  ---無data_object_id ,16進位制12位佔6個位元組
row#1[8002] flag: ------, lock: 0, len=17
col 0; len 7; (7):  41 4e 41 4c 59 53 54
col 1; len 6; (6):  01 00 00 20 00 0c
row#2[7987] flag: ------, lock: 0, len=15
col 0; len 5; (5):  43 4c 45 52 4b
col 1; len 6; (6):  01 00 00 20 00 00
row#3[7972] flag: ------, lock: 0, len=15
col 0; len 5; (5):  43 4c 45 52 4b
col 1; len 6; (6):  01 00 00 20 00 0a
row#4[7957] flag: ------, lock: 0, len=15
col 0; len 5; (5):  43 4c 45 52 4b
col 1; len 6; (6):  01 00 00 20 00 0b
row#5[7942] flag: ------, lock: 0, len=15
col 0; len 5; (5):  43 4c 45 52 4b
col 1; len 6; (6):  01 00 00 20 00 0d
rowid操作package:dbms_rowid ,相關過程、函式使用方法可以透過幫助獲得。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23135684/viewspace-668277/,如需轉載,請註明出處,否則將追究法律責任。

相關文章