oracle object_id和data_object_id的区别
Oracle的数据字典表dba_objects包含了两个字段,object_id, data_object_id,官方文档上的解释是:
object_id: Dictionary object number of the object.
Data_object_id: Dictionary object number of the segment that contains the object.
直译一下是:
object_id:对象的数据字典标示。
Data_object_id:包含对象的段的数据字典标示。
直译下来还是很难理解,不过下面就详细讲解他们的区别:
首先,区别一下段(segment)和数据字典对象(dictionary object)的概念,段(segment)是指实实在在的分配了一个或者多个区(extents)来存储数据。而数据字典对象(dictionary object)有可能有存储区域,也有可能没有。比如sequence,package,type这些对象并没有存储空间,所以并不存在段与之相关联。所以这些对象的data_object_id都是空值。
XPCHILD/XPCHILD@ORCL>select object_id, data_object_id from dba_objects where object_name='SEQ_TEST';
OBJECT_ID DATA_OBJECT_ID
---------- --------------
36385
下面看一个实际的例子,就能够很好的理解这两个概念了:
1. move 操作:
XPCHILD/XPCHILD@ORCL>select object_id, data_object_id from dba_objects where object_name='TEST1'; OBJECT_ID DATA_OBJECT_ID
---------- --------------
36386 36386 1 row selected.
XPCHILD/XPCHILD@ORCL>alter table test1 move; Table altered.
XPCHILD/XPCHILD@ORCL>select object_id, data_object_id from dba_objects where object_name='TEST1'; OBJECT_ID DATA_OBJECT_ID
---------- --------------
36386 36387
可以看到,test1在创建的时候,object_id, data_object_id都是36386.这是因为在创建的时候数据字典分配的机制是相同的。使用move操作,而本身move操作只是重新分配了空间来重组原来的数据,所以对象本身没有发生变化,而是重新分配了段来存储数据。
2. partition分区表
XPCHILD/XPCHILD@ORCL>CREATE TABLE test2
2 (id number, status char(1))
PARTITION BY list(status) (PARTITION p_t VALUES ('t'), PARTITION p_f VALUES ('f')); Table created. XPCHILD/XPCHILD@ORCL>select object_name, SUBOBJECT_NAME, OBJECT_ID, DATA_OBJECT_ID from dba_objects where object_name='TEST2'; OBJECT_NAM SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID
---------- ------------------------------ ---------- --------------
TEST2 P_F 36390 36390
TEST2 P_T 36389 36389
TEST2 36388 3 rows selected
这个地方可以看出,test2对象只有object_id,而真正只有分区才会有data_object_id, 因为每一个分区分配了一个段。
接着再创建一个普通表:
XPCHILD/XPCHILD@ORCL>CREATE TABLE test3
( id number,
status char(1)
); XPCHILD/XPCHILD@ORCL>select object_name, object_id, data_object_id from dba_objects where object_name='TEST3'; OBJECT_NAM OBJECT_ID DATA_OBJECT_ID
---------- ---------- --------------
TEST3 36391 36391
然后进行分区交换:
XPCHILD/XPCHILD@ORCL>alter table test2 exchange partition p_t with table test3 including indexes; Table altered.
最后再看一下相关的object_id和data_object_id:
XPCHILD/XPCHILD@ORCL>select object_name, SUBOBJECT_NAME, object_id, data_object_id from dba_objects where object_name in ('TEST2','TEST3'); OBJECT_NAM SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID
---------- ------------------------------ ---------- --------------
TEST2 P_F 36390 36390
TEST2 P_T 36389 36391
TEST2 36388
TEST3 36391 36389
所以这个地方显而易见,在交换过后,对象的object_id都不会发生变变化,因为exchange操作并不会迁移数据,而仅仅是更改了对象的数据存储即段得指向,也就是更改了对象的指针,这个指针指向的是数据存储区域,即所谓的段。
3. 最后再看一下rowid
rowid是指数据块中行的物理地址。看一下rowid的组成:
XPCHILD/XPCHILD@ORCL>select rowid ,
2 substr(rowid,1,6) "OBJECT",
3 substr(rowid,7,3) "FILE",
4 substr(rowid,10,6) "BLOCK",
5 substr(rowid,16,3) "ROW",
6 dbms_rowid.rowid_object(rowid) object_id,
7 id
8 from test3 t; ROWID OBJECT FILE BLOCK ROW OBJECT_ID ID
------------------ ------------ ------ ------------ ------ ---------- ----------
AAAI4lAAMAAAhssAAA AAAI4l AAM AAAhss AAA 36389 1 1 row selected. XPCHILD/XPCHILD@ORCL>alter table test3 move; Table altered. XPCHILD/XPCHILD@ORCL>select rowid ,
2 substr(rowid,1,6) "OBJECT",
3 substr(rowid,7,3) "FILE",
4 substr(rowid,10,6) "BLOCK",
5 substr(rowid,16,3) "ROW",
6 dbms_rowid.rowid_object(rowid) object_id,
7 id
8 from test3 t; ROWID OBJECT FILE BLOCK ROW OBJECT_ID ID
------------------ ------------ ------ ------------ ------ ---------- ----------
AAAI4oAAMAAAhtMAAA AAAI4o AAM AAAhtM AAA 36392 1 1 row selected.
可以看到,rowid表示的是数据的在块中的地址,所以在rowid的组成中,object_id是所谓的段的数据字典id,即data_object_id,如上所示,对表进行move操作,object_id发生了变化,即验证了这个猜想。
oracle object_id和data_object_id的区别的更多相关文章
- 【转】OBJECT_ID和DATA_OBJECT_ID的区别
在user_objects等视图里面有两个比较容易搞混的字段object_id和data_object_id这两个字段基本上有什么大的区别呢?object_id其实是对每个数据库中数据对象的唯一标识d ...
- ORACLE object_id和data_object_id
object_id和data_object_id 都是对象的唯一标识. object_id是对象的逻辑标识 data_object_id是对象的物理标识 对于没有物理存储的对象,data_object ...
- oracle的oci和thin区别(数据源)
我是今天看到tomcat数据源的配置时,想起来这个问题,刚开始还不晓得thin是什么东西! database.url=jdbc:oracle:thin:angel/oracle@192.168.55. ...
- MySQL 和 Oracle 在 MyBatis 使用中的区别
MySQL 和 Oracle 在 MyBatis 使用中的区别: 区别 MySQL Oracle 存储过程的参数模式 mode 为 IN 时,是否需要指定 jdbcType 不需要:MyBatis 为 ...
- Access、SQLServer、Oracle常见SQL语句应用区别
Access.SQLServer.Oracle常见SQL语句应用区别 关劲松 PMP 如果要兼容Access.SQL Server.Oracle三个数据库版本:我们在编写SQL语句的过程中,尽量使用一 ...
- oracle模糊查询mysql的区别
https://blog.csdn.net/weixin_38673554/article/details/86503982#_1 oracle与使用mysql的区别 https://www.cnbl ...
- SQL Server 和 Oracle 以及 MySQL 有哪些区别?
SQL,在这里我理解成SQL Server.三者是目前市场占有率最高(依安装量而非收入)的关系数据库,而且很有代表性.排行第四的DB2(属IBM公司),与Oracle的定位和架构非常相似,就不赘述了. ...
- Oracle与Sql server的区别
一直搞不明白Oracle数据库和sql server的区别,今天我特意查资料把他们的区别整理出来 Oracle数据库:Oracle Database,又名Oracle RDBMS,或简称Oracle. ...
- Oracle JDBC:驱动版本区别与区分 [转]
classes12.jar,ojdbc14.jar,ojdbc5.jar和ojdbc6.jar的区别,之间的差异 在使用Oracle JDBC驱动时,有些问题你是不是通过替换不同版本的Oracle ...
随机推荐
- js读取Excel文件数据-IE浏览器
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head ...
- asp.net中Get请求和Post请求
Get和Post请求的区别:Get请求因为传输的数据在URL中,因此不安全,而且多数浏览器有限制其长度,最长为2KB.通过Get请求获取数据的方式:string strName=context.Req ...
- Haproxy配置参数
HAProxy配置中分成五部分内容,当然这些组件不是必选的,可以根据需要选择部分作为配置. ===================== global 参数是进程级的,通常和操作系统(OS)相关. ...
- javascript调用oc的方法
1.引入#import <JavaScriptCore/JavaScriptCore.h> 2.JSContext *jsContext = [self.webView valueForK ...
- c++primer复习(六)—面向对象编程
1 C++中,通过基类的引用(或指针)调用虚函数时,发生动态绑定,两个条件(基类引用或指针.虚函数)缺一不可 虚函数的默认实参将发生静态绑定 2 继承层次的根类一般都需要定义虚析构函数 3 任意非st ...
- (转)linux多线程,线程的分离与结合
转自:http://www.cnblogs.com/mydomain/archive/2011/08/14/2138454.htm 线程的分离与结合 在任何一个时间点上,线程是可结合的(joi ...
- 九度OJ 1108 堆栈的使用
题目地址:http://ac.jobdu.com/problem.php?pid=1108 题目描述: 堆栈是一种基本的数据结构.堆栈具有两种基本操作方式,push 和 pop.Push一个值会将其压 ...
- [翻译][MVC 5 + EF 6] 2:基础的增删改查(CRUD)
原文:Implementing Basic CRUD Functionality with the Entity Framework in ASP.NET MVC Application 1.修改Vi ...
- 如何通过CSS让DIV居中对齐
给Div对应的CSS的添加如下设定即可: MARGIN-RIGHT: auto; MARGIN-LEFT: auto;
- 使用NPOI操作Excel
案例:用NPOI动态生成一个Excel表,然后弹出对话框让用户下载,文件名是"用户列表.xls" 先去相关网站下载 NPOI DLL文件,再引用 application/x-e ...