实验出发点:
今天做关于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.操作系统版本
2.数据库版本
实验过程:
但是自己做实验还是有些出入的。
1.关于这两者的取值的实验如下:
根据大量实验发现,创建的对象的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.看不明白可以直接看如下实验:
从这里也可以看出,对表move操作会增加DATA_OBJECT_ID的值,具体原因还不知道,这是接下去可以探究的问题之一。
3.从网上资料看,truncate操作也有同样的效果。
不过自己实验发现,对非空表做截断才会。具体原因还不知道,这是接下去可以探究的问题之一。
实验结论:
具体结论前文可以明显看出来了,比较懒就不写了。
关于data_object_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.操作系统版本
- [oracle@oracle ~]$ uname -a
- 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
- [oracle@oracle ~]$ lsb_release -a
- 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
- Distributor ID: RedHatEnterpriseServer
- Description: Red Hat Enterprise Linux Server release 6.5 (Santiago)
- Release: 6.5
- Codename: Santiago
- SYS@proc> select * from v$version where rownum=1;
-
- BANNER
- --------------------------------------------------------------------------------
- Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
实验过程:
但是自己做实验还是有些出入的。
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;
-
- MAX_OBJECT_ID MAX_HWMINCR
- ------------- -----------
- 89219 89219
-
- SYS@proc> create table pc(id number);
-
- Table created.
-
- SYS@proc> select object_id,data_object_id from dba_objects where owner='SYS' and object_name='PC';
-
- OBJECT_ID DATA_OBJECT_ID
- ---------- --------------
- 89220 89220 --符合前文所说的创建新对象时候的取值规则
-
- SYS@proc>
- SYS@proc> drop table pc purge;
-
- Table dropped.
-
- 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;
-
- MAX_OBJECT_ID MAX_HWMINCR
- ------------- -----------
- 89219 89219
-
- SYS@proc> create table pc(id number);
-
- Table created.
-
- SYS@proc> select object_id,data_object_id from dba_objects where owner='SYS' and object_name='PC';
-
- OBJECT_ID DATA_OBJECT_ID
- ---------- --------------
- 89221 89221 --不符合前文所说的创建新对象时候的取值规则
从其他实验结果来看。特别地,当上述实验中的MAX_OBJECT_ID和MAX_HWMINCR不等的时候,新创建对象的object_id , data_object_id值为MAX_OBJECT_ID和MAX_HWMINCR其中比较大一个的曾经最大值+1。具体原因还不知道,这是接下去可以探究的问题之一。
2.看不明白可以直接看如下实验:
- SYS@proc> create table aa (id number);
-
- Table created.
-
- SYS@proc> select object_id,data_object_id from dba_objects where owner='SYS' and object_name='AA';
-
- OBJECT_ID DATA_OBJECT_ID
- ---------- --------------
- 89224 89224
-
- SYS@proc> alter table aa move tablespace test;
-
- Table altered.
-
- SYS@proc> select object_id,data_object_id from dba_objects where owner='SYS' and object_name='AA';
-
- OBJECT_ID DATA_OBJECT_ID
- ---------- --------------
- 89224 89225
-
- 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;
-
- MAX_OBJECT_ID MAX_HWMINCR
- ------------- -----------
- 89224 89225
-
- SYS@proc> create table yy(id number);
-
- Table created.
-
- SYS@proc> select object_id,data_object_id from dba_objects where owner='SYS' and object_name='YY';
-
- OBJECT_ID DATA_OBJECT_ID
- ---------- --------------
- 89226 89226
3.从网上资料看,truncate操作也有同样的效果。
不过自己实验发现,对非空表做截断才会。具体原因还不知道,这是接下去可以探究的问题之一。
- SYS@proc> select object_id,data_object_id from dba_objects where owner='SYS' and object_name='YY';
-
- OBJECT_ID DATA_OBJECT_ID
- ---------- --------------
- 89226 89226
-
- SYS@proc> select count(*) from yy;
-
- COUNT(*)
- ----------
- 0
-
- SYS@proc> truncate table yy;
-
- Table truncated.
-
- SYS@proc> select object_id,data_object_id from dba_objects where owner='SYS' and object_name='YY';
-
- OBJECT_ID DATA_OBJECT_ID
- ---------- --------------
- 89226 89226
-
- SYS@proc> insert into yy values(1);
-
- 1 row created.
-
- SYS@proc> commit;
-
- Commit complete.
-
- SYS@proc> truncate table yy;
-
- Table truncated.
-
- SYS@proc> select object_id,data_object_id from dba_objects where owner='SYS' and object_name='YY';
-
- OBJECT_ID DATA_OBJECT_ID
- ---------- --------------
- 89226 89227
实验结论:
具体结论前文可以明显看出来了,比较懒就不写了。
关于data_object_id的意义,待文中未解决的问题解决之后可能才会明白。
要是各位网友有知道的,欢迎指教,先谢谢。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30174570/viewspace-2140058/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/30174570/viewspace-2140058/
本文通过实验探讨了Oracle数据库中object_id与data_object_id的区别及取值规律,并针对创建、删除、移动表操作如何影响这两个ID进行了详细分析。


被折叠的 条评论
为什么被折叠?



