国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Oracle的rowid
Oracle的rowid(2008-05-05 14:46:26)

    Oracle中的ROWID是數(shù)據(jù)的物理地址。一個(gè)ROWID包含關(guān)于文件、塊和該塊中的行的一行信息。ROWID還包含其它數(shù)據(jù),如相關(guān)文件數(shù)和OBJECT_ID。

 

以下轉(zhuǎn)自:http://hi.baidu.com/55358669/blog/item/3aa82334c7a8713b5bb5f5d3.html

    ROWID可以分為物理rowid和邏輯rowid兩種。普通的堆表中的rowid是物理rowid,索引組織表(IOT)的rowid是邏輯rowid。oracle提供了一種urowid的數(shù)據(jù)類型,同時(shí)支持物理和邏輯rowid。本文主要關(guān)注物理rowid。

    物理rowid又分為擴(kuò)展rowid(extended rowid)和限制rowid(restricted rowid)兩種格式。限制rowid主要是oracle7以前的rowid格式,現(xiàn)在已經(jīng)不再使用,保留該類型只是為了兼容性。所以本文的提到物理rowid一般是指擴(kuò)展rowid格式。   

1.Rowid的顯示形式

我們從rowid偽列里select出來的rowid是基于base64編碼,一共有18位,分為4部分:

OOOOOOFFFBBBBBBRRR

其中:

OOOOOO: 六位表示data object id,根據(jù)object id可以確定segment。關(guān)于data object id和object id的區(qū)別,請參考http://www.orawh.com/index.php/archives/62

FFF: 三位表示相對文件號。根據(jù)該相對文件號可以得到絕對文件號,從而確定datafile。關(guān)于相對文件號和絕對文件號,請參考http://blog.itpub.net/post/330/22749

BBBBBB:六位表示data block number。這里的data block number是相對于datafile的編號,而不是相對于tablespace的編號。

RRR:三位表示row number。

 

Oracle提供了dbm_rowid來進(jìn)行rowid的一些轉(zhuǎn)換計(jì)算。

SQL> create table test(id int,name varchar2(30));

Table created.

SQL> insert into test values(1,'a');

row created.

SQL> commit;

Commit complete.

SQL> select rowid from test;

ROWID
------------------
AAAGbEAAHAAAAB8AAA

SQL> select dbms_rowid.rowid_object(rowid) obj#,
dbms_rowid.rowid_relative_fno(rowid) rfile#,
dbms_rowid.rowid_block_number(rowid) block#,
dbms_rowid.rowid_row_number(rowid) row#,
dbms_rowid.rowid_to_absolute_fno(rowid,'SYS','TEST') file#
from test;

OBJ# RFILE# BLOCK# ROW# FILE#
----------- ------------ ------------- ---------- ----------
26308 124 7

2. 如何從rowid計(jì)算得到obj#,rfile#,block#,row#

rowid是base64編碼的,用A~Z a~z 0~9 /共64個(gè)字符表示。A表示0,B表示1,……,a表示26,……,0表示52,……,+表示62,/表示63可以將其看做一個(gè)64進(jìn)制的數(shù)。

所以,

obj#=AAAGbE=6*64^2+27*64+4=26308

rfile#=AAH=7

block#=AAAAB8=64+60=124

row#=AAA=0

3. 如何從obj#,rfile#,block#,row#計(jì)算得到rowid

實(shí)際上就是將十進(jìn)制數(shù)轉(zhuǎn)化成64進(jìn)制數(shù),當(dāng)然,從二進(jìn)制轉(zhuǎn)化的規(guī)則比較簡單點(diǎn)。

將二進(jìn)制數(shù)從右到左,6個(gè)bit一組,然后將這6個(gè)bit組轉(zhuǎn)成10進(jìn)制數(shù),就是A~Z a~z 0~9 /這64個(gè)字符的位置(從0開始),替換成base64的字符即可。

obj#=26308=110 011011 000100=6 27 4=G E,補(bǔ)足成6位base64編碼,左邊填0,也就是A,結(jié)果為AAAGbE

rfile#=7=111=7=H,補(bǔ)足成3位,得到AAH

block#=124=1 111100=1 60=B 8,補(bǔ)足成6位,得到AAAAB8

row#=0,3位AAA

合起來就是AAAGbEAAHAAAAB8AAA

4. Rowid的內(nèi)部存儲格式

雖然我們從rowid偽列中select出來的rowid是以base64字符顯示的,但在oracie內(nèi)部存儲的時(shí)候還是以原值的二進(jìn)制表示的。一個(gè)擴(kuò)展rowid采用10個(gè)byte來存儲,共80bit,其中obj#32bit,rfile#10bit,block#22bit,row#16bit。所以相對文件號不能超過1023,也就是一個(gè)表空間的數(shù)據(jù)文件不能超過1023個(gè)(不存在文件號為0的文件),一個(gè)datafile只能有2^22=4M個(gè)block,,一個(gè)block中不能超過2^16=64K行數(shù)據(jù)。而一個(gè)數(shù)據(jù)庫內(nèi)不能有超過2^32=4G個(gè)object。

SQL> select dump(rowid,16) from test;

DUMP(ROWID,16)
--------------------------------------------

Typ=69 Len=10: 0,0,66,c4,1,c0,0,7c,0,0

00000000 00000000 01100110 11000100 00000001 11000000 00000000 01111100 00000000 00000000

最右邊16bit為row#=00000000 00000000=0

接下來22bit為block#=000000 00000000 01111100=124

接下來10bit為rfile#=00000001 11=7

接下來32bit為obj#=00000000 00000000 01100110 11000100=26308

5. Index中存儲的rowid

a. 普通B-tree索引

SQL> create index ix_test on test(id);

Index created.

SQL> select file_id,block_id from dba_extents where segment_name='IX_TEST' and owner=user;

FILE_ID BLOCK_ID
---------- ----------
129

---由于是assm表空間,去掉3個(gè)block的頭
SQL> alter system dump datafile block 132; 

System altered.

得到trace文件內(nèi)容如下(省略無關(guān)內(nèi)容):
row#0[8024] flag: -----, lock: 0
col 0; len 2; (2): c1 02 ---索引鍵數(shù)據(jù)ID=1
col 1; len 6; (6): 01 c0 00 7c 00 00 ---對應(yīng)的rowid記錄
----- end of leaf block dump -----
End dump data blocks tsn: file#: minblk 132 maxblk 132

普通索引中保存的rowid是不包括obj#的,但是分區(qū)表的global index是包括obj#的,這是因?yàn)榉謪^(qū)表包括多個(gè)segment,每個(gè)segment可能在不同的datafile中,根據(jù)表的obj#就無法確定該索引鍵對應(yīng)的rowid(rfile#確定不了)。

01 c0 00 7c 00 00 轉(zhuǎn)化為二進(jìn)制 000000001 11000000 00000000 01111100 00000000 00000000

右邊8bit row#=0

接下來22bit block#=000000 00000000 01111100=124

接下來10bit rfile#=000000001 11=7

b.唯一索引

SQL> drop index ix_test;

Index dropped.

SQL> create unique index ix_test on test(id);

Index created.

SQL> select file_id,block_id from dba_extents where segment_name='IX_TEST' and owner=user;

FILE_ID BLOCK_ID
---------- ----------
129

SQL> alter system dump datafile block 132; 

System altered.

得到trace文件內(nèi)容如下:

row#0[8025] flag: -----, lock: 0, data:(6): 01 c0 00 7c 00 00 ---對應(yīng)的rowid記錄
col 0; len 2; (2): c1 02 ---
索引鍵數(shù)據(jù)ID=1
----- end of leaf block dump -----
End dump data blocks tsn: file#: minblk 132 maxblk 132

得到rowid為 01 c0 00 7c 00 00,具體的轉(zhuǎn)換計(jì)算和前面的一樣,就不重復(fù)了。

 

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
deadlock的一些Sample
Oracle rowid 詳解 (轉(zhuǎn))
linux輸入輸出重定向使用詳解(收藏)
oracle 10g中的ROWID
Oracle的ROWID類型
新書連載:深入剖析dump block對數(shù)據(jù)庫的影響
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服