设为首页 加入收藏

TOP

oracle rowid详解(四)
2014-11-24 08:06:47 来源: 作者: 【 】 浏览:3
Tags:oracle rowid 详解
BAAAGiRAAf ALERT_QUE_N

AAAAASAABAAAGiRAAe ALERT_QUE_R

AAAAASAABAAAGiRAAG ALERT_TYPE

我们可以使用dbms_rowid从extened rowid中抽取各部分信息,或者将extened rowid转换成restricted rowed,详细的信息参见sys.dbms_rowid的规范

#根据rowid抽块对像编号

SQL> select dbms_rowid.rowid_object('AAAAASAABAAAGiRAAG') obj# from dual;

OBJ#

----------

18

#根据rowid抽取表空间相对文件号

SQL> select dbms_rowid.rowid_relative_fno('AAAAASAABAAAGiRAAG') rfile# from dual;

RFILE#

----------

1

#根据rowid抽取块号

SQL> select dbms_rowid.ROWID_BLOCK_NUMBER('AAAAASAABAAAGiRAAG') block# from dual;

BLOCK#

----------

26769

#根据rowid抽取行号

SQL> select dbms_rowid.rowid_row_number('AAAAASAABAAAGiRAAG') row# from dual;

ROW#

----------

6

#将extended rowid转换成为restricted rowid

SQL> select dbms_rowid.rowid_to_restricted('AAAAASAABAAAGiRAAG',0) restricted_rowid from dual;

RESTRICTED_ROWID

------------------

00006891.0006.0001

1.2.2restricted rowid

限制地址行号与扩展地址行号编码方式不一样,它在内部使用二进制方式表示,当用select查询时,会转换成varchar2/16进制的混合形式,它的组织方式如下:

BBBBBBBB.RRRR.FFFF (block#.row#.file#)

注意,这里的文件号是绝对文件号,而extended rowid中是相对文件号(相对表空间)

Restricted rowid中不再有object number,因为从绝对文件号可以唯一确定数据块

样例可以参考前面的00006891.0006.0001

另外请注意,块中的行号是从0开始

除了用dbms_rowid来抽取rowid的不同部分外,也可以用substr

#extended rowid

SQL> SELECT ROWID,

2007-02-01 15:19:28
2 SUBSTR(ROWID,1,6) "OBJECT",
3 SUBSTR(ROWID,7,3) "FIL",
4 SUBSTR(ROWID,10,6) "BLOCK",
5 SUBSTR(ROWID,16,3) "ROW"
6 from obj$ where rownum<=5;

ROWID OBJECT FIL BLOCK ROW
------------------ ------------ ------ ------------ ------
AAAAASAABAAAAB6AAa AAAAAS AAB AAAAB6 AAa
AAAAASAABAAAAB6AAu AAAAAS AAB AAAAB6 AAu
AAAAASAABAAAAB6AAF AAAAAS AAB AAAAB6 AAF
AAAAASAABAAAAB6AAv AAAAAS AAB AAAAB6 AAv
AAAAASAABAAAAB6AAZ AAAAAS AAB AAAAB6 AAZ

#restricted rowid
SQL> SELECT ROWID,
2 SUBSTR(ROWID,15,4) "FILE",
3 SUBSTR(ROWID,1,8) "BLOCK",
4 SUBSTR(ROWID,10,4) "ROW"
5 from obj$ where rownum<=5;

ROWID FILE BLOCK ROW
------------------ -------- ---------------- --------
AAAAASAABAAAAB6AAa 6AAa AAAAASAA AAAA
AAAAASAABAAAAB6AAu 6AAu AAAAASAA AAAA
AAAAASAABAAAAB6AAF 6AAF AAAAASAA AAAA
AAAAASAABAAAAB6AAv 6AAv AAAAASAA AAAA
AAAAASAABAAAAB6AAZ 6AAZ AAAAASAA AAAA

请注意extented rowid与restricted rowid的编码方式不一样,大家不能拿两种不同编码方式的组件作比较,比如AAAAASAABAAAAB6AAa 这行的File#在两种方式下是有不同的值,表示不同的意义,没有可比性.

下面的语句可以查看表的数据分布在几个文件中
SQL> SELECT COUNT(DISTINCT(SUBSTR(ROWID,7,3))) "FILES" FROM BOSSSTATSDATA;

FILES
----------
17
#下面验证bossstatsdata的数据确实分布在17个文件中
SQL> select count(file_name) from dba_data_files where TABLESPACE_NAME= (select TABLESPACE_NAME from user_tables where table_name='BOSSSTATSDATA');

COUNT(FILE_NAME)
----------------
17

总结Rowid的使用场景
1) 构建索引结构, 每个key都有一个rowid指向相应的表行
2) rowid是访问表行的最快的方法
3) rowid可用于观察表数据是怎样组织的
4) rowid是表行的唯一标识符

在任何DML中使用rowid时,应该注意确保相关的行不会改变物理地址(不会被export/import,delete)

1.3 logical rowids
用于表达IOT行地址的Logical rowid存储在索引的叶子节点中,会随着索引entry的insert在块内或块间移动,所以,它不是基于物理地址而是基于primary key的标识符,所以取名叫logcial rowid
Oracle使用logical rowids来构建IOT的secondary indexes
由于在实际的应用中很少会使用到IO

首页 上一页 1 2 3 4 下一页 尾页 4/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇oracle read rewrite 功能概述 下一篇Oracle数据库厉行计划详解

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C 内存管理 | 菜鸟教 (2025-12-26 20:20:37)
·如何在 C 语言函数中 (2025-12-26 20:20:34)
·国际音标 [ç] (2025-12-26 20:20:31)
·微服务 Spring Boot (2025-12-26 18:20:10)
·如何调整 Redis 内存 (2025-12-26 18:20:07)