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格式
![](http://hi.csdn.net/attachment/201106/21/0_13086308237MR7.gif)
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
实验准备
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格式
![](http://hi.csdn.net/attachment/201106/21/0_13086308237MR7.gif)
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
相关文章推荐
- Oracle ROWID详解
- oracle 增删改查基础操作 及rownum 和rowID 详解 .
- 详解ORACLE ROWID之来龙去脉
- Oracle rowid详解
- Oracle 10g 中的ROWID详解
- Oracle ROWID详解
- [Oracle] rowid详解
- Oracle rowid详解 .
- oracle rowid 详解
- 【转载】oracle之rowid详解
- [Oracle] rowid详解
- Oracle rowid 详解
- oracle 增删改查基础操作 及rownum 和rowID 详解
- Oracle RAC Cache Fusion 机制 详解
- Oracle ASM 详解
- oracle技术之oracle检查点及oracle SCN详解
- Oracle中job使用详解
- ORACLE 性能优化-手工修改统计信息(不得已为之)详解
- Oracle Rownum 伪列详解
- ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句