Oracle中的Rowid
生活随笔
收集整理的這篇文章主要介紹了
Oracle中的Rowid
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這篇文章是參考甲骨論老相老師的教學視頻
http://v.youku.com/v_show/id_XMzkyMjE3NTA0.html
所做的學習筆記。
1.什么是Rowid
這里的Rowid,并不是1條數據行在表中的編號的意思.
而是指Table中某一條數據行在數據文件中的物理地址,
而我們可以根據這個物理地址獲得這一行數據行的數據在幾號數據文件中的第幾個block里面的的第幾行等信息.
可以用select rowid,* from Table語句來獲得rowid的值.
下面舉個列子
2.創建1張表
語句如下:
create table T_rowid (
??? a int,
??? b varchar2(4000) default rpad('*',4000,'*'),
??????? c varchar2(3000) default rpad('*',3000,'*')
)
/
注意上面rpad('*',4000,'*')的意思就是4000個 *啦
?
3.插入刪除更新數據等一系列操作..
?? 語句如下:
insert into T_rowid(a) values (1);
insert into T_rowid(a) values (2);
insert into T_rowid(a) values (3);
delete from T_rowid where a = 2;
insert into T_rowid(a) values (4);
commit;
/
?
??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
可以見到我是先插入a=2的行,然后把它delete了, 再插入a=4的行. ?? 跟著就commit了.
??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
4.接下來查看這張表數據行的Rowid ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
???? Oracle有個dbms.rowid 系統包, 可以用于查看rowid的信息
如下圖:
?
??? 好明顯, 見到順序來講, 后插入的"4" 的rowid 會比 先插入的"3"那一行要前.
??? 原因也很簡單,? 因為在commit之前,? 用戶對表數據所有操作都是在buffer cache里進行的, 這個例子中, 一開始Insert了3行數據到buffer cache里的3個buffer中,? 后來將第2行刪除了,? 接下來插入的等4行被放入了第2行原來的buffer中. 最后commit, DBWR會將3個buffer寫入到dbf中的3個block中.?
???? 但是, 上面196,197,198并不是就是對應3行數據的rowid,? 看函數名就知道,指的是rowid對應在dbf文件中的block號碼..
???? 要獲取rowid上面已經提過啦, 要用rowid這個列.
如上圖那一坨字符就是真正的rowid了.
5.寫1個函數get_rowid_info來查看對應的信息.
???? 如上圖了, 只獲取rowid是沒什么意義的, 還要借助其他工具來查看該rowid對應的信息, 其中1個很重要的工具就死后DBMS_ROWID這個包啦.
????? 我們也可以利用dbms_rowid這個包自己寫1個函數get_rowid_info來獲得更多的rowid信息.
create or replace function get_rowid_info(v_rowid in varchar2)
return varchar2
is
v_my_rowid varchar2(200);
n_rowid_type number;
n_obj_number number;
n_relative_info number;
n_block_number number;
n_row_number number;
begin
??????? dbms_rowid.rowid_info(v_rowid,n_rowid_type,n_obj_number,n_relative_info,n_block_number,n_row_number);
??????? v_my_rowid := 'Object# is?????? : ' || to_char(n_obj_number) || chr(10) ||
????????????????????? 'Relative_info is : ' || to_char(n_relative_info) || chr(10) ||
????????????????????? 'Block number is? : ' || to_char(n_block_number) || chr(10) ||
????????????????????? 'Row number is??? : ' || to_char(n_row_number);
??????? return v_my_rowid;
end;
/
?
然后我們試下執行,? 參數就選上面T_rowid表中, a=4那行數據啦, rowid= 'AAASOeAAEAAAADFAAB'
其中Object#就是 表T_rowid的object_id啦:
?
?而Relative_info = 4是指這個rowid在第4號數據文件中
而block number就是該block在上面數據文件中的編號啦.
row number 就是在這block里面的第幾行啦.
?
?
http://v.youku.com/v_show/id_XMzkyMjE3NTA0.html
所做的學習筆記。
1.什么是Rowid
這里的Rowid,并不是1條數據行在表中的編號的意思.
而是指Table中某一條數據行在數據文件中的物理地址,
而我們可以根據這個物理地址獲得這一行數據行的數據在幾號數據文件中的第幾個block里面的的第幾行等信息.
可以用select rowid,* from Table語句來獲得rowid的值.
下面舉個列子
2.創建1張表
語句如下:
create table T_rowid (
??? a int,
??? b varchar2(4000) default rpad('*',4000,'*'),
??????? c varchar2(3000) default rpad('*',3000,'*')
)
/
注意上面rpad('*',4000,'*')的意思就是4000個 *啦
?
3.插入刪除更新數據等一系列操作..
?? 語句如下:
insert into T_rowid(a) values (1);
insert into T_rowid(a) values (2);
insert into T_rowid(a) values (3);
delete from T_rowid where a = 2;
insert into T_rowid(a) values (4);
commit;
/
?
??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
可以見到我是先插入a=2的行,然后把它delete了, 再插入a=4的行. ?? 跟著就commit了.
??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
4.接下來查看這張表數據行的Rowid ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
???? Oracle有個dbms.rowid 系統包, 可以用于查看rowid的信息
如下圖:
?
??? 好明顯, 見到順序來講, 后插入的"4" 的rowid 會比 先插入的"3"那一行要前.
??? 原因也很簡單,? 因為在commit之前,? 用戶對表數據所有操作都是在buffer cache里進行的, 這個例子中, 一開始Insert了3行數據到buffer cache里的3個buffer中,? 后來將第2行刪除了,? 接下來插入的等4行被放入了第2行原來的buffer中. 最后commit, DBWR會將3個buffer寫入到dbf中的3個block中.?
???? 但是, 上面196,197,198并不是就是對應3行數據的rowid,? 看函數名就知道,指的是rowid對應在dbf文件中的block號碼..
???? 要獲取rowid上面已經提過啦, 要用rowid這個列.
如上圖那一坨字符就是真正的rowid了.
5.寫1個函數get_rowid_info來查看對應的信息.
???? 如上圖了, 只獲取rowid是沒什么意義的, 還要借助其他工具來查看該rowid對應的信息, 其中1個很重要的工具就死后DBMS_ROWID這個包啦.
????? 我們也可以利用dbms_rowid這個包自己寫1個函數get_rowid_info來獲得更多的rowid信息.
create or replace function get_rowid_info(v_rowid in varchar2)
return varchar2
is
v_my_rowid varchar2(200);
n_rowid_type number;
n_obj_number number;
n_relative_info number;
n_block_number number;
n_row_number number;
begin
??????? dbms_rowid.rowid_info(v_rowid,n_rowid_type,n_obj_number,n_relative_info,n_block_number,n_row_number);
??????? v_my_rowid := 'Object# is?????? : ' || to_char(n_obj_number) || chr(10) ||
????????????????????? 'Relative_info is : ' || to_char(n_relative_info) || chr(10) ||
????????????????????? 'Block number is? : ' || to_char(n_block_number) || chr(10) ||
????????????????????? 'Row number is??? : ' || to_char(n_row_number);
??????? return v_my_rowid;
end;
/
?
然后我們試下執行,? 參數就選上面T_rowid表中, a=4那行數據啦, rowid= 'AAASOeAAEAAAADFAAB'
其中Object#就是 表T_rowid的object_id啦:
?
?而Relative_info = 4是指這個rowid在第4號數據文件中
而block number就是該block在上面數據文件中的編號啦.
row number 就是在這block里面的第幾行啦.
?
?
總結
以上是生活随笔為你收集整理的Oracle中的Rowid的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle - 使用各种SQL来熟知b
- 下一篇: Oracle 日志原理剖析