Rowid 字段类型:
Rowid 是一行数据的一个唯一标识。
ROWID 是数据的详细地址,通过 rowid,oracle 可以快速的定位某行具体的数据的位置。 ROWID 可以分为物理 rowid 和逻辑 rowid 两种。普通的堆表中的 rowid 是物理 rowid,索引组织表(IOT)的 rowid 是逻辑 rowid。oracle 提供了一种 urowid 的数据类型,同时支持物理和逻辑 rowid。本文主要关注物理 rowid。
物理 rowid 又分为扩展 rowid(extended rowid)和限制 rowid(restricted rowid)两种格式。限制 rowid 主要是 oracle7 以前的 rowid 格式,现在已经不再使用,保留该类型只是为了兼容性。 所下面来做个例子,来帮助我们认识它:
SQL> create table test(id number,name varchar2(10)); Table created.
插入几条数据
SQL> insert into test values(0,'orcl');
SQL> insert into test values(1,'orcl');
SQL> insert into test values(2,'orcl');
SQL> insert into test values(3,'orcl');
查看表内容
SQL> select rowid,id,name from test; ROWID ID NAME ------------------ ---------- ---------- AAAV5DAAOAAAACWAAA 0 orcl AAAV5DAAOAAAACWAAB 1 orcl AAAV5DAAOAAAACWAAC 3 orcl AAAV5DAAOAAAACWAAD 2 orcl
Rowid 是一个隐藏的字段,每一张表都存在,默认查看一张数据的时候不会出现。只有特意加上 rowid 字段才会出现。
Rowid 的结构:
Rowid 的显示形式
我们从 rowid 伪列里 select 出来的 rowid 是基于 base64 编码,一共有 18 位,分为 4 部分:
OOOOOOFFFBBBBBBRRR
现在的格式是 9i 及以后版本的格式。
前 6 位( OOOOOO )为数据对象 ID,一张表、一个所引都是一个数据对象,oracle 都会分配给他们一个唯一的数据对象。
紧跟的 3 位( FFF )为相对的文件 ID,我们知道表空间是由不同的文件组成,对象存储的某个文件里,每个文件会对应一个 ID 号
再接着的 6 位( BBBBBB )为块 ID ,文件是由块组成的,每个块也有一个唯一的 ID 编号。
最后 3 位( RRR )为行 ID ,每个块又可划分成行,每个行也有一个 ID 号。
可以根据64位编码表转义到具体的数据对象ID、文件ID、块ID、行ID。
select dbms_rowid.rowid_object(rowid) obj_id,
dbms_rowid.rowid_relative_fno(rowid) rfile_id,
dbms_rowid.rowid_block_number(rowid) block_id,
dbms_rowid.rowid_row_number(rowid) row_id,
dbms_rowid.rowid_to_absolute_fno(rowid,'TEST','ITPUX') file#
from test.itpux;
SQL> select dbms_rowid.rowid_object(rowid) obj_id, 2 dbms_rowid.rowid_relative_fno(rowid) rfile_id, 3 dbms_rowid.rowid_block_number(rowid) block_id, 4 dbms_rowid.rowid_row_number(rowid) row_id, 5 dbms_rowid.rowid_to_absolute_fno(rowid,'TEST','TEST') file# 6 from test.test; OBJ_ID RFILE_ID BLOCK_ID ROW_ID FILE# ---------- ---------- ---------- ---------- ---------- 89667 14 150 0 14 89667 14 150 1 14 89667 14 150 2 14 89667 14 150 3 14