是否有1个东西叫Data_object_id, 如果有的话,它是用来做什么的呢? 正巧,在也有人问这个问题。我当时并不清楚Data_object_id 是什么,但它的确在视图ALL_OBJECTS里存在。 Hmmm..有趣,它到底是什么。最现在那个论坛里回答了, 根据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个例子:
首先查看数据库版本
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE 11.2.0.4.0 Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production
创建1张表
查看该表的object_id 和 Data_object_id,
注:表tab$ 仲 OBJ# 存放的就是对象的object_id, 而 dataobj#存放的就是对象的data_object_id.
SQL> select obj#,dataobj#,tab# from tab$ where obj# in
2 (select object_id from user_objects where object_name='TMP_JASON1');
OBJ# DATAOBJ# TAB#
---------- ---------- ----------
87416 87416
截断这张表
SQL> truncate table tmp_jason1;
Table truncated.
再查看该表的object_id 和 Data_object_id, ..(无变化,作者原文是变化了的,可能由于这张表原来就是空表的关系)
SQL> select obj#,dataobj#,tab# from tab$ where obj# in
2 (select object_id from user_objects where object_name='TMP_JASON1');
OBJ# DATAOBJ# TAB#
---------- ---------- ----------
87416 87416
执行alter table xxx move, 这个语句一般用来移动表到另1个表空间(move 后面要加表空间参数),或者用来整理碎片(消除行移植和行链接), 但是会导致索引失效,所以要重建索引。
alter index xxx rebuild online
SQL> alter table tmp_jason1 move;
Table altered.
再查看该表的object_id 和 Data_object_id, 见到Data_obj_id已经发生变化了。
SQL> select obj#,dataobj#,tab# from tab$ where obj# in
2 (select object_id from user_objects where object_name='TMP_JASON1');
OBJ# DATAOBJ# TAB#
---------- ---------- ----------
87416 87417
|