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