Oracle的Rowid详解

本文介绍了Oracle数据库中的RowID概念,包括其格式、存储方式及如何通过dbms_rowid包进行RowID的分解。RowID是一种基于64位编码的18个字符的唯一标识符,用于快速定位数据库中的特定行。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值