Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1119052
  • 博文数量: 231
  • 博客积分: 2500
  • 博客等级: 少校
  • 技术积分: 2662
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-03 16:35
个人简介

学无止境

文章分类

全部博文(231)

文章存档

2014年(7)

2013年(103)

2011年(11)

2010年(53)

2009年(57)

分类: Oracle

2009-11-25 18:49:47

object_id和data_object_id都是表示数据库对象的唯一标志。
 
object_id是数据库对象的逻辑id
data_object_id是数据库对象的物理id
 
如果一些object没有物理属性的话那它就不存在data_object_id,例如procedure,function,package,data type,db link,mv定义,view定义,临时表,分区表定义等等这些object都是没有对应着某个segment,因此它们的data_object_id都为空。
 
当一个表建立的时候,他的object_id 和 data_object_id是相等的。当表move和truncate后data_object_id会发生变化。修改表结构不会更改。
SQL> create table ldy.obid as select rownum as "rn" from dba_objects;
表已创建。
SQL> select object_id,data_object_id from dba_objects where object_name='OBID' and owner='LDY';
 OBJECT_ID DATA_OBJECT_ID
---------- --------------
     12436          12436
    
SQL> select header_file,header_block,blocks from dba_segments where segment_name='OBID' and owner='LDY';
HEADER_FILE HEADER_BLOCK     BLOCKS
----------- ------------ ----------
          7       190347         24    
         
         
SQL> alter table ldy.obid move;
表已更改。
SQL> select object_id,data_object_id from dba_objects where object_name='OBID' and owner='LDY';
 OBJECT_ID DATA_OBJECT_ID
---------- --------------
     12436          12437

表经过move后,物理ID发生变化.
SQL> select header_file,header_block,blocks from dba_segments where segment_name='OBID' and owner='LDY';
HEADER_FILE HEADER_BLOCK     BLOCKS
----------- ------------ ----------
          7       190371         24
SQL> truncate table ldy.obid;
表被截断。
SQL> select object_id,data_object_id from dba_objects where object_name='OBID' and owner='LDY';
 OBJECT_ID DATA_OBJECT_ID
---------- --------------
     12436          12438
SQL> select header_file,header_block,blocks from dba_segments where segment_name='OBID' and owner='LDY';
HEADER_FILE HEADER_BLOCK     BLOCKS
----------- ------------ ----------
          7       190371          8
表经过truncate 后 物理ID也发生变化。

SQL> alter table ldy.obid add (n number);
表已更改。
SQL> select object_id,data_object_id from dba_objects where object_name='OBID' and owner='LDY';
 OBJECT_ID DATA_OBJECT_ID
---------- --------------
     12436          12438
SQL> select header_file,header_block,blocks from dba_segments where segment_name='OBID' and owner='LDY';
HEADER_FILE HEADER_BLOCK     BLOCKS
----------- ------------ ----------
          7       190371          8         
给表增加一个列,也没发生变化
所以总上所简述
只有当segment发生变化时data_object_id才发生变化
有时候我们根据rowid 算时得到的data_object_id会误以为就是object_id,因为要是没有发生segment变化时
两者值是相等的
阅读(810) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~