Professional Documents
Culture Documents
Ora Obj$ 1
Ora Obj$ 1
解释是:
object_id: Dictionary object number of the object.
Data_object_id: Dictionary object number of the segment that contains the object.
首先,区别一下段(segment)和数据字典对象(dictionary object)的概念,段(segment)
是指实实在在的分配了一个或者多个区(extents)来存储数据。而数据字典对象(dictionary
object)有可能有存储区域,也有可能没有。比如 sequence,package,type 这些对象并没有
存储空间,所以并不存在段与之相关联。所以这些对象的 data_object_id 都是空值。
1. move 操作:
select object_id, data_object_id from dba_objects where object_name='TEST1';
OBJECT_ID DATA_OBJECT_ID
---------- --------------
36386 36386
1 row selected.
alter table test1 move;
Table altered.
select object_id, data_object_id from dba_objects where object_name='TEST1';
OBJECT_ID DATA_OBJECT_ID
---------- --------------
36386 36387
2. partition 分区表
CREATE TABLE test2 (id number, status char(1)) PARTITION BY list(status) (PARTITION p_t
VALUES ('t'), PARTITION p_f VALUES ('f'));
Table created.
接着再创建一个普通表:
CREATE TABLE test3 ( id number, status char(1) );
alter table test2 exchange partition p_t with table test3 including indexes;
Table altered.
最后再看一下相关的 object_id 和 data_object_id:
3. 最后再看一下 rowid
rowid 是指数据块中行的物理地址。看一下 rowid 的组成:
select rowid, substr(rowid,1,6) "OBJECT", substr(rowid,7,3) "FILE",
substr(rowid,10,6) "BLOCK”, substr(rowid,16,3) "ROW",
dbms_rowid.rowid_object(rowid) object_id, id from test3 t;
1 row selected.
object_id 是数据库里的对象的唯一标识。数据库中每个对象都会被分配一个唯一的好号码作
为区别的标志。同样地,每 1 个数据库 object 都会 link 住 1 个 segment(数据段), 而 Data_obj
ect_id 就是分配给那个对应的 segment。
(译者注:上面那句不保证正确性,因为 1 个数据库对象是可以对应不同表空间内多个
segm ent 的)。当那个 segment 发生了任何物理变动,都会令这个数值改变。这两个 ID 的值
在一开始是相等的,但是当对应 segment 发生变动时,Data_object_id 会改变。这两个 ID 都
是 Oracle 用来表示存放在数据字典的元数据(数据目录)。
DATA_OBJECT_ID was introduced in 8.0 to track versions of the same segment (certain operati
ons change the version). It is used to discover stale ROWIDs and stale undo records.
1) 创建新表
SQL> create table sdxj.xiaoxu_objectid as select * from dba_objects;
表已创建。
2) 查看该表的 object_id 和 data_object_id,
注:表 tab$OBJ#存放的就是对象的 object_id,dataobj#存放的就是对象的 data_object_id。
SQL> select owner,object_name,object_id,data_object_id from dba_objects where object_nam
e='XIAOXU_OBJECTID';
OWNER OBJECT_NAME OBJECT_ID DATA_OBJECT_ID
---------- -------------------------------------------------- ---------- --------------
SDXJ XIAOXU_OBJECTID 77782 77782 ----初始大小相等。
3.4 truncate 操作
SQL> truncate table sdxj.XIAOXU_OBJECTID; ----表被截断。
SQL> select owner,object_name,object_id,data_object_id from dba_objects where object_na
me='XIAOXU_OBJECTID';
OWNER OBJECT_NAME OBJECT_ID DATA_OBJECT_ID
---------- -------------------------------------------------- ---------- --------------
SDXJ XIAOXU_OBJECTID 77782 77790 ---值发生变化。
4) 新增对象 OBJECT_ID 为 max(data_object_id)+1
数据库最大 data_object_id 查询:
select max(data_object_id ) from dba_objects; 得到 3251768
新建对象 index
create index sdxj.idx_xiao3 on sdxj.XIAOXU_OBJECTID2 (table_name);
---对应 object_id 和 data_object_id 为 3251769
1.关于这两者的取值的实验如下:
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
2.看不明白可以直接看如下实验:
create table aa (id number);
Table created.
3.从网上资料看,truncate 操作也有同样的效果。
不过自己实验发现,对非空表做截断才会。具体原因未知,这是接下去可以探究的问题之
一。
select object_id,data_object_id from dba_objects where owner='SYS' and object_name='YY';
OBJECT_ID DATA_OBJECT_ID
---------- --------------
89226 89226
commit;
Commit complete.