Oracle中object_id和data_object_id的区别

本文通过实验探讨了Oracle数据库中object_id与data_object_id的区别及取值规律,并针对创建、删除、移动表操作如何影响这两个ID进行了详细分析。
实验出发点:
今天做关于flush buffer cache和x$bh关系的时候,发现的一个问题,详情可以请看http://blog.itpub.net/30174570/viewspace-2140062/

其他资料:
正如文章题目而言,两者有什么区别?

http://blog.itpub.net/12361284/viewspace-170223/ 可以得到以下信息:
1.object_id其实是对每个数据库中数据对象的唯一标识
2.data_object_id用的相比来说会少一些,主要是和seg$对应,用来表示object的物理存储段的实际位置.
只有表,索引,undo这些有实际物理存储位置的对象才有data_object_id,而像一些函数,存储过程,以及view等等是没有data_object_id的,也就是说仅有object_id

另外,当创建一个新的对象的时候object_id和data_object_id应该分别取
max(select max(object_id) from dba_objects)+1,
max(select max(hwmincr) from seg$)+1

环境说明:
1.操作系统版本
  1. [oracle@oracle ~]$ uname -a
  2. Linux oracle.example.com 2.6.32-431.el6.x86_64 #1 SMP Sun Nov 10 22:19:54 EST 2013 x86_64 x86_64 x86_64 GNU/Linux
  3. [oracle@oracle ~]$ lsb_release -a
  4. LSB Version:    :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch
  5. Distributor ID:    RedHatEnterpriseServer
  6. Description:    Red Hat Enterprise Linux Server release 6.5 (Santiago)
  7. Release:    6.5
  8. Codename:    Santiago
2.数据库版本
  1. SYS@proc> select * from v$version where rownum=1;

  2. BANNER
  3. --------------------------------------------------------------------------------
  4. Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

实验过程:
但是自己做实验还是有些出入的。
1.关于这两者的取值的实验如下:
  1. SYS@proc> select a.max_object_id,b.max_hwmincr from (select max(object_id) max_object_id from dba_objects) a,(select max(hwmincr) max_hwmincr from seg$) b;

  2. MAX_OBJECT_ID MAX_HWMINCR
  3. ------------- -----------
  4.         89219       89219

  5. SYS@proc> create table pc(id number);

  6. Table created.

  7. SYS@proc> select object_id,data_object_id from dba_objects where owner='SYS' and object_name='PC';

  8.  OBJECT_ID DATA_OBJECT_ID
  9. ---------- --------------
  10.      89220          89220         --符合前文所说的创建新对象时候的取值规则

  11. SYS@proc>
  12. SYS@proc> drop table pc purge;

  13. Table dropped.

  14. SYS@proc> select a.max_object_id,b.max_hwmincr from (select max(object_id) max_object_id from dba_objects) a,(select max(hwmincr) max_hwmincr from seg$) b;

  15. MAX_OBJECT_ID MAX_HWMINCR
  16. ------------- -----------
  17.         89219       89219

  18. SYS@proc> create table pc(id number);

  19. Table created.

  20. SYS@proc> select object_id,data_object_id from dba_objects where owner='SYS' and object_name='PC';

  21.  OBJECT_ID DATA_OBJECT_ID
  22. ---------- --------------
  23.      89221          89221        --不符合前文所说的创建新对象时候的取值规则
根据大量实验发现,创建的对象的object_id和data_object_id取值会取MAX_OBJECT_ID和MAX_HWMINCR曾经达到的最大值+1,也就是上述实验中一开始pc表的object_id , data_object_id均为 89220 ,但是drop表pc之后, 89220 数值并不能重用,新创建的对象只能取 89220 +1的数值具体原因还不知道,这是接下去可以探究的问题之一。

从其他实验结果来看。特别地,当上述实验中的MAX_OBJECT_ID和MAX_HWMINCR不等的时候,新创建对象的object_id , data_object_id值为MAX_OBJECT_ID和MAX_HWMINCR其中比较大一个的曾经最大值+1。具体原因还不知道,这是接下去可以探究的问题之一。
2.看不明白可以直接看如下实验:
  1. SYS@proc> create table aa (id number);

  2. Table created.

  3. SYS@proc> select object_id,data_object_id from dba_objects where owner='SYS' and object_name='AA';

  4.  OBJECT_ID DATA_OBJECT_ID
  5. ---------- --------------
  6.      89224          89224

  7. SYS@proc> alter table aa move tablespace test;

  8. Table altered.

  9. SYS@proc> select object_id,data_object_id from dba_objects where owner='SYS' and object_name='AA';

  10.  OBJECT_ID DATA_OBJECT_ID
  11. ---------- --------------
  12.      89224          89225

  13. SYS@proc> select a.max_object_id,b.max_hwmincr from (select max(object_id) max_object_id from dba_objects) a,(select max(hwmincr) max_hwmincr from seg$) b;

  14. MAX_OBJECT_ID MAX_HWMINCR
  15. ------------- -----------
  16.         89224       89225

  17. SYS@proc> create table yy(id number);

  18. Table created.

  19. SYS@proc> select object_id,data_object_id from dba_objects where owner='SYS' and object_name='YY';

  20.  OBJECT_ID DATA_OBJECT_ID
  21. ---------- --------------
  22.      89226          89226
从这里也可以看出,对表move操作会增加DATA_OBJECT_ID的值,具体原因还不知道,这是接下去可以探究的问题之一。

3.从网上资料看,truncate操作也有同样的效果。
不过自己实验发现,对非空表做截断才会。具体原因还不知道,这是接下去可以探究的问题之一
  1. SYS@proc> select object_id,data_object_id from dba_objects where owner='SYS' and object_name='YY';

  2.  OBJECT_ID DATA_OBJECT_ID
  3. ---------- --------------
  4.      89226          89226

  5. SYS@proc> select count(*) from yy;

  6.   COUNT(*)
  7. ----------
  8.      0

  9. SYS@proc> truncate table yy;

  10. Table truncated.

  11. SYS@proc> select object_id,data_object_id from dba_objects where owner='SYS' and object_name='YY';

  12.  OBJECT_ID DATA_OBJECT_ID
  13. ---------- --------------
  14.      89226          89226

  15. SYS@proc> insert into yy values(1);

  16. 1 row created.

  17. SYS@proc> commit;

  18. Commit complete.

  19. SYS@proc> truncate table yy;

  20. Table truncated.

  21. SYS@proc> select object_id,data_object_id from dba_objects where owner='SYS' and object_name='YY';

  22.  OBJECT_ID DATA_OBJECT_ID
  23. ---------- --------------
  24.      89226          89227

实验结论:

具体结论前文可以明显看出来了,比较懒就不写了。
关于data_object_id的意义,待文中未解决的问题解决之后可能才会明白。
要是各位网友有知道的,欢迎指教,先谢谢。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30174570/viewspace-2140058/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30174570/viewspace-2140058/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值