聊聊oracle rowid与索引结构
ROWID定义
ROWID:数据库中行的全局唯一地址
对于数据中的每一行,rowid伪列返回行的地址。rowid值主要包含以下信息:
- 对象的数据对象编号
- 该行所在的数据文件中的数据块
- 该行中数据块的位置(第一行是0)
- 数据行所在的数据文件(第一个文件是1)。该文件编号是相对于表空间。
扩展ROWID
- 从Oracle 8i开始使用扩展rowid标识行物理地址
- 扩展rowid使用base64编码行的物理地址,编码字符包含 A-Z, a-z, 0-9, +, 和 /。
- 扩展rowid由四部分组成:OOOOOOOFFFBBBBBBRRR:
其中
1. OOOOOO:数据对象编号(6位显示)
2. FFF:相关数据文件编号(3位显示)
3. BBBBBB:数据块编号(6位显示)
4. RRR:数据块中行编号(3位显示)
base 64编码
实例
create table my_rowid(id number,name varchar2(50));
insert into my_rowid values(1,'whz');
insert into my_rowid values(2,'chiclewu');
commit;
- 查询1
select rowid,
substr(rowid, 1, 6) "#object",
substr(rowid, 7, 3) "#file",
substr(rowid, 10, 6) "#block",
substr(rowid, 16, 3) "#rowno",
length(rowid) len
from my_rowid;
结果:
* 查询2
Select rowid,
dbms_rowid.rowid_object(rowid) "#object",
dbms_rowid.rowid_relative_fno(rowid) "#file",
dbms_rowid.rowid_block_number(rowid) "#block",
dbms_rowid.rowid_row_number(rowid) "#row"
from my_rowid;
结果:
索引结构
索引存储了索引列和ROWID。