使用 rowID查询数据位于分区表哪个分区中

来源:互联网 发布:黑客网络hacknet安卓版 编辑:程序博客网 时间:2024/04/30 15:49
--使用rowID获取table的object_IDselect  rowID,        dbms_rowid.rowid_object(rowid)  object_id,        dbms_rowid.rowid_relative_fno(rowid)  file_num,        dbms_rowid.rowid_block_number(rowid)  block_number,        dbms_rowid.rowid_row_number(rowid) row_number,        dbms_rowid.rowid_to_absolute_fno(rowid,'SYS','TEST') file#from  tablewhere table.conditon = 'Your condition'

--根据objectID得知该数据位于哪个分区select  a.object_name,        a.object_type,        a.subobject_name,        a.object_id,        a.data_object_id  from  dba_objects a where  object_name = UPPER('TABLE_NAME')   and  object_id = 3019792
以上为原创.

--rowID的含义:

参考自:http://blog.csdn.net/haiross/article/details/15338061

为了方便,我直接放这里了:

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格式,现在已经不再使用,保留该类型只是为了兼容性。所以本文的提到物理rowid一般是指扩展rowid格式。

本文主要内容:

1.Rowid的显示形式

2.如何从rowid计算得到obj#,rfile#,block#,row#

3.如何从obj#,rfile#,block#,row#计算得到rowid

4.Rowid的内部存储格式

5.Index中存储的rowid


1.Rowid的显示形式

我们从rowid伪列里select出来的rowid是基于base64编码,一共有18位,分为4部分:

OOOOOOFFFBBBBBBRRR

其中:

OOOOOO: 六位表示data object id,根据object id可以确定segment。关于data object id和object id的区别,请参考http://www.orawh.com/index.php/archives/62

FFF: 三位表示相对文件号。根据该相对文件号可以得到绝对文件号,从而确定datafile。关于相对文件号和绝对文件号,请参考http://blog.itpub.net/post/330/22749

BBBBBB:六位表示data block number。这里的data block number是相对于datafile的编号,而不是相对于tablespace的编号。

RRR:三位表示row number。

Oracle提供了dbm_rowid来进行rowid的一些转换计算。

SQL> create table test(id int,name varchar2(30));

Table created.

SQL> insert into test values(1,'a');

1 row created.

SQL> commit;

Commit complete.

SQL> select rowid from test;

ROWID
------------------
AAAGbEAAHAAAAB8AAA

SQL> select dbms_rowid.rowid_object(rowid) obj#,
2 dbms_rowid.rowid_relative_fno(rowid) rfile#,
3 dbms_rowid.rowid_block_number(rowid) block#,
4 dbms_rowid.rowid_row_number(rowid) row#,
5 dbms_rowid.rowid_to_absolute_fno(rowid,'SYS','TEST') file#
6 from test;


--Oracle object_id和data_object_id的区别

Oracle的数据字典表dba_objects包含了两个字段,object_id, data_object_id,官方文档上的解释是:

object_id: Dictionary object number of the object.Data_object_id: Dictionary object number of the segment that contains the object.

object_id : 数据的编号,类似于row_number

Data_object_id:存储数据的物理地址,类似于指针


阅读全文
1 0