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的区别的更多相关文章

  1. 【转】OBJECT_ID和DATA_OBJECT_ID的区别

    在user_objects等视图里面有两个比较容易搞混的字段object_id和data_object_id这两个字段基本上有什么大的区别呢?object_id其实是对每个数据库中数据对象的唯一标识d ...

  2. ORACLE object_id和data_object_id

    object_id和data_object_id 都是对象的唯一标识. object_id是对象的逻辑标识 data_object_id是对象的物理标识 对于没有物理存储的对象,data_object ...

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

    我是今天看到tomcat数据源的配置时,想起来这个问题,刚开始还不晓得thin是什么东西! database.url=jdbc:oracle:thin:angel/oracle@192.168.55. ...

  4. MySQL 和 Oracle 在 MyBatis 使用中的区别

    MySQL 和 Oracle 在 MyBatis 使用中的区别: 区别 MySQL Oracle 存储过程的参数模式 mode 为 IN 时,是否需要指定 jdbcType 不需要:MyBatis 为 ...

  5. Access、SQLServer、Oracle常见SQL语句应用区别

    Access.SQLServer.Oracle常见SQL语句应用区别 关劲松 PMP 如果要兼容Access.SQL Server.Oracle三个数据库版本:我们在编写SQL语句的过程中,尽量使用一 ...

  6. oracle模糊查询mysql的区别

    https://blog.csdn.net/weixin_38673554/article/details/86503982#_1 oracle与使用mysql的区别 https://www.cnbl ...

  7. SQL Server 和 Oracle 以及 MySQL 有哪些区别?

    SQL,在这里我理解成SQL Server.三者是目前市场占有率最高(依安装量而非收入)的关系数据库,而且很有代表性.排行第四的DB2(属IBM公司),与Oracle的定位和架构非常相似,就不赘述了. ...

  8. Oracle与Sql server的区别

    一直搞不明白Oracle数据库和sql server的区别,今天我特意查资料把他们的区别整理出来 Oracle数据库:Oracle Database,又名Oracle RDBMS,或简称Oracle. ...

  9. Oracle JDBC:驱动版本区别与区分 [转]

    classes12.jar,ojdbc14.jar,ojdbc5.jar和ojdbc6.jar的区别,之间的差异 在使用Oracle JDBC驱动时,有些问题你是不是通过替换不同版本的Oracle  ...

随机推荐

  1. c语言学习之基础知识点介绍(十二):结构体的介绍

    一.结构体的介绍 /* 语法: struct 结构体名{ 成员列表; }; 切记切记有分号! 说明:成员列表就是指你要保存哪些类型的数据. 注意:上面的语法只是定义一个新的类型,而这个类型叫做结构体类 ...

  2. Java——有关日期的方法

    1.日期转换成String格式化输出: public String getDate() { SimpleDateFormat format = new SimpleDateFormat("y ...

  3. (六)Hibernate 映射类型

    所有项目导入对应的hibernate的jar包.mysql的jar包和添加每次都需要用到的HibernateUtil.java 第一节:基本类型映射 例子: hibernate.cfg.xml < ...

  4. OC - 9.使用Quartz2D绘制下载进度条

    效果图 实现思路 要实现绘图,通常需要自定义一个UIView的子类,重写父类的- (void)drawRect:(CGRect)rect方法,在该方法中实现绘图操作 若想显示下载进度,只需要实例化自定 ...

  5. html表格 第五节

    表格: <html> <head> <title>表格实例</title> </head> <body> <center& ...

  6. LA 3177 Beijing Guards(二分法 贪心)

    Beijing Guards Beijing was once surrounded by four rings of city walls: the Forbidden City Wall, the ...

  7. Sdut 2164 Binomial Coeffcients (组合数学) (山东省ACM第二届省赛 D 题)

    Binomial Coeffcients TimeLimit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 输入 输出 示例输入 1 1 10 2 9 ...

  8. HTML知识点纲要(1)

    什么是 HTML?HTML,全称是Hyper Text Markup Language,即超文本标记语言.是用来描述网页的一种标记语言. HTML 标签HTML标签是由尖括号包围的关键词,通常成对出现 ...

  9. sql 自身连接

    "select table1.field1, table2.field1 from table table1, table table2 where table1.id=table2.par ...

  10. js 作为属性的变量

    当声明一个javascript全局变量时,实际上是定义了全局对象的一个属性. 当使用var声明一个变量时,创建的这个属性是不可配置的,也就是说这个变量无法通过delete运算符来删除.可能你已经注意到 ...