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 ...
随机推荐
- 使用Visual Studio发布应用安装包
安装包制作方式 使用Visual Studio进行应用的打包分发有两种方式: 1.使用Clickonce发布安装包: 2.使用Setup工程发布安装包. 操作步骤 Clickonce发布安装包 1.右 ...
- redhat5.8无法进入图形界面
解决办法: 删除/etc/X11/xorg.conf文件
- maven打war包注意之xml、properties文件没打进去解决方法
maven项目在ide中编译出的war包一般不会有很多问题. 但是经过集成环境打war包会出现war包中打不进xml.properties等文件.这样打war包不会报错,但是war包放进tomcat中 ...
- Codevs 1217 借教室 2012年NOIP全国联赛提高组
1217 借教室 2012年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 在大学期间,经常需要租借教 ...
- OpenJudge/Poj 1517 u Calculate e
1.链接地址: http://bailian.openjudge.cn/practice/1517 http://poj.org/problem?id=1517 2.题目: 总时间限制: 1000ms ...
- Nginx(一)初始环境的安装(php5.3+mysql5.1+fastcgi…)
关参考资源http://www.lnmp.org/index.html \\LNMP一键安装包http://www.howtocn.org/nginx \\Nginx模块参考手册中文版http://b ...
- Netty源码阅读(一) ServerBootstrap启动
Netty源码阅读(一) ServerBootstrap启动 转自我的Github Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速 ...
- php MVC 及例子解释
根据http://www.21ds.net/article/4/453改写: MVC模式在网站架构中十分常见.它允许我们建立一个三层结构的应用程式,从代码中分离出有用的层,帮助设计师和开发者协同工作以 ...
- HTML 多媒体
1.多媒体简介 Web 上的多媒体指的是音效.音乐.视频和动画,多媒体有多种不同的格式,它可以是听到或看到的任何内容,文字.图片.音乐.音效.录音.电影.动画等等.在互联网上,几乎在所有网站都能发现嵌 ...
- PHP正则表达式 验证电子邮件地址
我们最经常遇到的验证,就是电子邮件地址验证.网站上常见.各种网页脚本也都常用“正则表达式”(regular expression)对我们输入的电子邮件地址进行验证,判断是否合法.有的还能分解出用户名和 ...