您的位置:首页 > 数据库 > Oracle

Oracle的Rowid详解

2011-06-21 12:33 281 查看
1
实验准备

SQL> create table bl(id number);
Table created
SQL> insert into bl values(1);
1 row inserted
SQL> commit;
Commit complete
SQL> col owner format a5;
SQL> col segment_name format a15;
SQL> select owner,segment_name,file_id,RELATIVE_FNO,block_id from dba_extents where owner='SYS' and segment_name='BL';
OWNER SEGMENT_NAME      
FILE_ID RELATIVE_FNO   BLOCK_ID
----- --------------- ---------- ------------ ----------
SYS  
BL                       1           
1      60689
SQL> select bl.*, rowid from bl;
       
ID ROWID
---------- ------------------
        
1 AAAM0aAABAAAO0SAAA
2
rowid格式





2.1
rowid显示方式

rowid
的显示方式: 基于 64 位编码的 18 个字符显示
它包含下列组成元素:
1.
数据对象编号:每个数据对象(如表或索引)在创建时都分配有此编号,并且此编号在数据库中是唯一的
2.
相关文件编号:此编号对于表空间中的每个文件是唯一的
3.
块编号:表示包含此行的块在文件中的位置
4.
行编号:标识块头中行目录位置的位置
2.2
rowid存储方式

rowid
的存储方式: 10 个字节即80位存储, 其中数据对象编号需要32位,相关文件编号需要10位,块编号需要22,位行编号需 要 16
位,由此得出:
32bit
的 object number ,每个数据库最多有 4G
个对象
10bit
的 file number ,每个对象最多有 1022
个文件( 2 个文件预留)
22bit
的 block number ,每个文件最多有 4M
个 BLOCK
16bit
的 row number ,每个 BLOCK
最多有 64K 个 ROWS
3
分解rowid

rowid:
AAAM0aAABAAAO0SAAA
object_number:
AAAM0a
relative_fno: 
AAB
block_number: 
AAAO0S
block_number: 
AAA
3.1
进制换算

A-Z
 ßà 
0 - 25  (26)
a-z
 ßà 
26 - 51 (26)
0-9
 ßà
 52 - 61 (10)
+/  
ßà 
62 - 63 (2)
AAAM0a = 12*(64^2) + 52*(64^1) + 26 = 49152 + 3328 + 26 = 52506
AAB   
= 0 + 0 + 1 = 1
AAAO0S = 14*(64^2) + 52*(64^1) + 26 = 57344 + 3328 + 18 =
60690
AAA   
= 0
4
dbms_rowid.rowid_info

SQL> set serveroutput on
SQL> DECLARE
 
2     v_rowid_type          NUMBER;
 
3     v_OBJECT_NUMBER       NUMBER;
 
4     v_RELATIVE_FNO        NUMBER;
 
5     v_BLOCK_NUMBERE_FNO   NUMBER;
 
6     v_ROW_NUMBER          NUMBER;
 
7  BEGIN
 
8     DBMS_ROWID.rowid_info (rowid_in       
=> 'AAAM0aAABAAAO0SAAA',
 
9                            rowid_type     
=> v_rowid_type,
 10                           
object_number   => v_OBJECT_NUMBER,
 11                           
relative_fno    => v_RELATIVE_FNO,
 12                           
block_number    => v_BLOCK_NUMBERE_FNO,
 13                           
ROW_NUMBER      => v_ROW_NUMBER);
 14    
DBMS_OUTPUT.put_line ('ROWID_TYPE:  ' || TO_CHAR (v_rowid_type));
 15    
DBMS_OUTPUT.put_line ('OBJECT_NUMBER:  ' || TO_CHAR (v_OBJECT_NUMBER));
 16    
DBMS_OUTPUT.put_line ('RELATIVE_FNO:  ' || TO_CHAR (v_RELATIVE_FNO));
 17    
DBMS_OUTPUT.put_line ('BLOCK_NUMBER:  ' || TO_CHAR (v_BLOCK_NUMBERE_FNO));
 18    
DBMS_OUTPUT.put_line ('ROW_NUMBER:  ' || TO_CHAR (v_ROW_NUMBER));
 19 
END;
 20 
/
 
ROWID_TYPE: 
1
OBJECT_NUMBER: 
52506
RELATIVE_FNO: 
1
BLOCK_NUMBER: 
60690
ROW_NUMBER: 
0
5
dbms_rowid包的另一种方法(常用)

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 bl where id = 1;
OBJECT_ID   
FILE_ID   BLOCK_ID        NUM
---------- ---------- ---------- ----------
    
52506          1      60690         
0
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息