Oracle的Rowid详解

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、付费专栏及课程。

余额充值