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