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:对象的数据字典标示。
Data_object_id:包含对象的段的数据字典标示。

直译下来还是很难理解,不过下面就详细讲解他们的区别:

  首先,区别一下段(segment)和数据字典对象(dictionary
object)的概念,段(segment)是指实实在在的分配了一个或者多个区(extents)来存储数据。而数据字典对象(dictionary
object)有可能有存储区域,也有可能没有。比如sequence,package,type这些对象并没有存储空间,所以并不存在段与之相关联。所以这些对象的data_object_id都是空值。

  

XPCHILD/XPCHILD@ORCL>select object_id, data_object_id from dba_objects where object_name=‘SEQ_TEST‘;
OBJECT_ID DATA_OBJECT_ID
---------- --------------
36385

下面看一个实际的例子,就能够很好的理解这两个概念了:

1.  move 操作:


XPCHILD/XPCHILD@ORCL>select object_id, data_object_id from dba_objects where object_name=‘TEST1‘;

OBJECT_ID DATA_OBJECT_ID
---------- --------------
36386 36386

1 row selected.
XPCHILD/XPCHILD@ORCL>alter table test1 move;

Table altered.
XPCHILD/XPCHILD@ORCL>select object_id, data_object_id from dba_objects where object_name=‘TEST1‘;

OBJECT_ID DATA_OBJECT_ID
---------- --------------
36386 36387

可以看到,test1在创建的时候,object_id,
data_object_id都是36386.这是因为在创建的时候数据字典分配的机制是相同的。使用move操作,而本身move操作只是重新分配了空间来重组原来的数据,所以对象本身没有发生变化,而是重新分配了段来存储数据。

2.  partition分区表

  


XPCHILD/XPCHILD@ORCL>CREATE TABLE test2
2 (id number, status char(1))
PARTITION BY list(status) (PARTITION p_t VALUES (‘t‘), PARTITION p_f VALUES (‘f‘));

Table created.

XPCHILD/XPCHILD@ORCL>select object_name, SUBOBJECT_NAME, OBJECT_ID, DATA_OBJECT_ID from dba_objects where object_name=‘TEST2‘;

OBJECT_NAM SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID
---------- ------------------------------ ---------- --------------
TEST2 P_F 36390 36390
TEST2 P_T 36389 36389
TEST2 36388

3 rows selected

这个地方可以看出,test2对象只有object_id,而真正只有分区才会有data_object_id,
因为每一个分区分配了一个段。

接着再创建一个普通表:

  


XPCHILD/XPCHILD@ORCL>CREATE TABLE test3
( id number,
status char(1)
);

XPCHILD/XPCHILD@ORCL>select object_name, object_id, data_object_id from dba_objects where object_name=‘TEST3‘;

OBJECT_NAM OBJECT_ID DATA_OBJECT_ID
---------- ---------- --------------
TEST3 36391 36391

然后进行分区交换:

XPCHILD/XPCHILD@ORCL>alter table test2 exchange partition p_t with table test3 including indexes;

Table altered.

最后再看一下相关的object_id和data_object_id:


XPCHILD/XPCHILD@ORCL>select object_name, SUBOBJECT_NAME, object_id, data_object_id from dba_objects where object_name in (‘TEST2‘,‘TEST3‘);

OBJECT_NAM SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID
---------- ------------------------------ ---------- --------------
TEST2 P_F 36390 36390
TEST2 P_T 36389 36391
TEST2 36388
TEST3 36391 36389

所以这个地方显而易见,在交换过后,对象的object_id都不会发生变变化,因为exchange操作并不会迁移数据,而仅仅是更改了对象的数据存储即段得指向,也就是更改了对象的指针,这个指针指向的是数据存储区域,即所谓的段。

3.
  
最后再看一下rowid

  


rowid是指数据块中行的物理地址。看一下rowid的组成:
XPCHILD/XPCHILD@ORCL>select rowid ,
2 substr(rowid,1,6) "OBJECT",
3 substr(rowid,7,3) "FILE",
4 substr(rowid,10,6) "BLOCK",
5 substr(rowid,16,3) "ROW",
6 dbms_rowid.rowid_object(rowid) object_id,
7 id
8 from test3 t;

ROWID OBJECT FILE BLOCK ROW OBJECT_ID ID
------------------ ------------ ------ ------------ ------ ---------- ----------
AAAI4lAAMAAAhssAAA AAAI4l AAM AAAhss AAA 36389 1

1 row selected.

XPCHILD/XPCHILD@ORCL>alter table test3 move;

Table altered.

XPCHILD/XPCHILD@ORCL>select rowid ,
2 substr(rowid,1,6) "OBJECT",
3 substr(rowid,7,3) "FILE",
4 substr(rowid,10,6) "BLOCK",
5 substr(rowid,16,3) "ROW",
6 dbms_rowid.rowid_object(rowid) object_id,
7 id
8 from test3 t;

ROWID OBJECT FILE BLOCK ROW OBJECT_ID ID
------------------ ------------ ------ ------------ ------ ---------- ----------
AAAI4oAAMAAAhtMAAA AAAI4o AAM AAAhtM AAA 36392 1

1 row selected.

  可以看到,rowid表示的是数据的在块中的地址,所以在rowid的组成中,object_id是所谓的段的数据字典id,即data_object_id,如上所示,对表进行move操作,object_id发生了变化,即验证了这个猜想。

oracle object_id和data_object_id的区别,布布扣,bubuko.com

时间: 2025-01-14 13:03:15

oracle object_id和data_object_id的区别的相关文章

【转】OBJECT_ID和DATA_OBJECT_ID的区别

在user_objects等视图里面有两个比较容易搞混的字段object_id和data_object_id这两个字段基本上有什么大的区别呢?object_id其实是对每个数据库中数据对象的唯一标识data_object_id用的相比来说会少一些,主要是和seg$对应,用来表示object的物理存储段的实际位置.只有表,索引,undo这些有实际物理存储位置的对象才有data_object_id,而像一些函数,存储过程,以及view等等是没有data_object_id的,也就是说仅有object

ORACLE object_id和data_object_id

object_id和data_object_id 都是对象的唯一标识. object_id是对象的逻辑标识 data_object_id是对象的物理标识 对于没有物理存储的对象,data_object_id就是空.例如:(procedure,function,package,data type,db link,mv定义,view定义,临时表,分区表定义等等) 当表刚创建的时候它的object_id和data_object_id都是相等的,但是如果表经过move或truncate后那么data_o

ORACLE nvarchar2和varchar2的区别

ORACLE nvarchar2和varchar2的区别 1.NVARCHAR2中存储中文字时,一个中文字当一个字符来处理 NVARCHAR2(10)是可以存进去10个汉字的,如果用来存英文也只能存10个字符. 2.而VARCHAR2中一个中文字当两个字符来处理 VARCHAR2(10)的话,则只能存进5个汉字,英文则可以存10个 Oracle中nvarchar2和varchar2的共同点: 不定长存储,当存储信息长度小于指定的长度,那么就已实际存入的长度为准这一点不像varchar这种定长存储

oracle的oci和thin区别

我是今天看到tomcat数据源的配置时,想起来这个问题,刚开始还不晓得thin是什么东西! database.url=jdbc:oracle:thin:angel/[email protected]:1530:monitordb 经过上网查询,得到如下结果: jdbc:oracle连接的是oracle数据库 thin是一种方法 angel/oracle那个angel是用户名,oracle是密码 192.168.55.11是你要连的电脑ip 1530是oracle的连端口(1521貌似是默认端口)

oracle标准版、企业版区别

一.Oracle 9i标准版.企业版 Oracle 9i标准版 Oracle 9i企业版 ?Jserver Enterprise Edition ?InterMedia ?Enterprise Manager ?Workflow Standard Edition ?Standard Management Pack ?Object Option ?Networking kit ?Object for OLE ?Distributed Option ?64 bit Option ?ODBC Driv

oracle的oci和thin区别(数据源)

我是今天看到tomcat数据源的配置时,想起来这个问题,刚开始还不晓得thin是什么东西! database.url=jdbc:oracle:thin:angel/[email protected]:1530:monitordb 经过上网查询,得到如下结果: jdbc:oracle连接的是oracle数据库 thin是一种方法 angel/oracle那个angel是用户名,oracle是密码 192.168.55.11是你要连的电脑ip 1530是oracle的连端口(1521貌似是默认端口)

MySQL 和 Oracle 在 MyBatis 使用中的区别

MySQL 和 Oracle 在 MyBatis 使用中的区别: 区别 MySQL Oracle 存储过程的参数模式 mode 为 IN 时,是否需要指定 jdbcType 不需要:MyBatis 为 IN 模式提供了默认的 jdbcType,没有为 OUT 模式提供 如果入参存在 null 的情况,需要 存储过程的参数模式 mode 为 OUT 时,是否需要指定 jdbcType 需要 需要 是否支持游标参数 不支持 支持 原文地址:https://www.cnblogs.com/cag205

SQL Server 、 Oracle 以及 MySQL 有哪些区别?

SQL,在这里我理解成SQL Server.三者是目前市场占有率最高(依安装量而非收入)的关系数据库,而且很有代表性.排行第四的DB2(属IBM公司),与Oracle的定位和架构非常相似,就不赘述了. 如果要说明三者的区别,首先就要从历史入手. Oracle:中文译作甲骨文,这是一家传奇的公司,有一个传奇的大老板Larry Ellision. Ellision 32岁还一事无成,读了三个大学,没得到一个学位文凭,换了十几家公司,老婆也离他而去.开始创业时只有1200美元,却使得Oracle公司连

Oracle Access和filter的区别

在查看Oracle执行计划的时候经常会遇到Access和filter,脑容量太小,总是分不清两者的区别...稍作整理. Access:表示对应的谓词条件会影响数据的访问路径(是按照索引还是表) Filter:表示谓词条件只会起到过滤作用,不会影响数据的访问路径. 因此,需要着重关注filter部分是否可创建索引 如下示例:在code字段上建有索引,name上没有索引 Access的栗子 filter的栗子