转译:Oracle 中 Object_iD 和 Data_Object_ID 的区别

转译自Aman Sharma的blog:
http://blog.aristadba.com/?tag=data_object_id

事实上还有很多关于Oracle数据库的知识我不了解,特别是一些辅助性的知识点。几乎每一天,都会有一些新的东西出现在我面前,这让我意识到我所知道的是多么少?  昨天和今天也不例外,我知道了两个以前我并不了解的新东西。现在我把其中1项分享出来,迟d我会分享另1个。

几天前有人问我1个问题: 是否有1个东西叫Data_object_id, 如果有的话,它是用来做什么的呢? 正巧,在OTN论坛也有人问这个问题。我当时并不清楚Data_object_id 是什么,但它的确在视图ALL_OBJECTS里存在。 Hmmm..有趣,它到底是什么。ASK Tom最现在那个论坛里回答了, 根据TOM所说:

object_id 是数据库里的对象的唯一标识--数据库中每1个对象都会被分配1个唯一的好号码作为区别的标志。
同样地,每1个数据库object都会link住1个segment(数据段), 而Data_object_id就是分配给那个对应的segment.
(译者住:上面那句不保证正确性,因为1个数据库对象是可以对应不同表空间内多个segment的)
当那个segment发生了任何物理变动,都会令这个数值改变。 这两个ID的值在一开始是相等的,但是当对应segment
发生变动时, Data_object_id会改变。 这两个ID都是Oracle用来表示存放在数据字典的元数据(数据目录)。

看1个例子:
首先查看数据库版本


创建1张表


查看该表的object_idData_object_id,
注:表tab$OBJ# 存放的就是对象的object_id, 而 dataobj#存放的就是对象的data_object_id.


截断这张表


再查看该表的object_idData_object_id, ..(无变化,作者原文是变化了的,可能由于这张表原来就是空表的关系)

 
执行alter table xxx move, 这个语句一般用来移动表到另1个表空间(move 后面要加表空间参数),或者用来整理碎片(消除行移植和行链接), 但是会导致索引失效,所以要重建索引。
alter index xxx rebuild online


再查看该表的object_idData_object_id, 见到Data_obj_id已经发生变化了。


嗯,这就是有一样我学到的东西,我很肯定除了我之外,所有人都应该了解它,但之前我的确不清楚这个知识。老实说,我居然不清楚1件微小而简单的事情,实在令我受刺激了。再次令我深心一个人无论什么时候都要“stay hungry, stay foolish“(保持饥饿感,不自满)(斯提芬.佐治 名言),还有十分感谢Tom Kyte,他一直在帮我们更深地了解oracle 数据系统。
posted @ 2013-04-02 00:55  Gateman  阅读(1058)  评论(0编辑  收藏  举报