`
chorpin
  • 浏览: 132206 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

oracle学习总结(一)---ROWID(转)

阅读更多
       搞oracle都会经常碰到rowid,本文是笔者根据网上各位的文章,加上自己学习中的体会,总结而成。
一.rowid简介

        rowid就是唯一标志记录物理位置的一个id,在oracle 8版本以前,rowid由file#+block#+row#组成,占用6个bytes的空间,10 bit 的 file# ,22bit 的 block# ,16 bit 的 row#。

          从oracle 8开始rowid变成了extend rowid,由data_object_id#+rfile#+block#+row#组成,占用10个bytes的空间, 32bit的 data_object_id#,10 bit 的 rfile#,22bit 的 block#,16 bit 的 row#.由于rowid的组成从file#变成了rfile#,所以数据文件数的限制也从整个库不能超过1023个变成了每个表空间不能超过1023个 数据文件。
        说了rowid的组成,那么我们再来看看rowid在索引里面占用的字节数又是什么样子的。在oracle 8以前索引中存储的rowid占用字节数也是6bytes,在oracle8之后,虽然oracle使用了extend rowid,但是在普通索引里面依然存储了bytes的rowid,只有在global index中存储的是10bytes的extend rowid,而extend rowid也是global index出现的一个必要条件,下面我们会解释原因。

        为什么golbal index需要把data_object_id#也包含在index rowid entry中呢?如果不包含会这么样?首先我们需要知道index的rowid entry的存在是为了能根据它找到表的这条记录存在哪个具体的物理位置,我们需要知道它在哪个数据文件,在哪个block,在那一行,普通的索引 oracle根据rfile#,block#,row#就可以知道了,但是partition table可以分布在多个表空间,也就是可以分布在多个数据文件,当我们建立local index时,index rowid entry并不包含data_object_id#,因为oracle可以知道这个index对应的是哪一个table分区,并可以得到table分区的 ts#(tablespace号),那么oracle根据ts#和rfile#就可以找到具体的数据文件。但是如果换成是golbal index,如果不包含data_object_id#,那么我们并不能知道这个索引对应着哪个表分区,也自然不能知道它的rfile#和file#的转 换关系,所以它将找不到所对应的记录。包含data_object_id#后,oracle可以根据data_object_id#实现rfile#和 file#的转换然后找到记录对应的物理位置。需要注意的是要理解以上概念我们还是需要了解file#和rfile#的区别。

二.比较file#和rfile#

oracle数据文件为什么存在file#和rfile#?
         归根结底的原因是因为 ROWID 的存储格式造成的,因为 rowid 中文件编号标志只有10bit,最大数据容量1024,由于不存在0编号文件,所以实际上只允许1023个文件编号。在oracle8 之前的版本的数据库中,rowid是受限的,只包括 file# /block#  /row#  ,则数据库最多只允许1023个文件。

        而oracle8开始rowid 包括 data_object_id# / Rfile#  /block# /rowid# 。data object id 的引入,同时支持了表分区的概念,一个表可以拥有多个分区(segment),而一个分区可以在不同的表空间中(由Rfile# 表示在segment对应的表空间中对应的 相对文件编号)。这样表的容量也增大了。 扩展的rowid使得oracle不再局限于数据文件只能有1023个的限制,而一个表可以分区,也使得表的容量不再局限于单个表空间中(1023个文件 的限制)。

        当然,你或许要问,为什么oracle不调整rowid中表示 file# 的  bit数量,这个应该是由于兼容性的引起的,在 oracle7 的索引中存储的rowid就是 file# +  block# + row# ,,因为这样处理后关于索引的存储,oracle8和oracle7没有发生变化(在oracle8中一个索引(可能分区)segment肯定对应了一个 表(可能分区)的segment,这个可以由数据字典关系得到,从而确立了 索引中的rowid 对应哪个 表空间中的数据文件),在升级的时候就不用关心 索引的问题,而直接升级oracle软件以及运行相关的包,否则将会大动干戈解决索引的问题。这就是oracle实现物理文件升级的基础。

        当 然,真正升级的时候,一些数据文件头的 rfile# 需要发生变化,这也是有文件的一些存储的特性决定的,为了不和oracle8的格式发生冲突,才需要修改。这个修改代价非常的小,所以oracle选择了 这个方案。详细的信息,大家可以去参考metalink相关内容,有详细的  存储(byte 中字节位)的变化关系。

三.rowid举例

1.创建一临时表
create table test_rowid (id number, row_id rowid);
2.插入一行记录
insert into test_rowid values(1,null);
3.修改刚插入的记录
update test_rowid set row_id = rowid where id = 1;
4.查看rowid
select rowid,row_id from test_rowid;
返回结果为:
rowid                                                      row_id
AAAO0DAAJAAAAMYAAA               AAAO0DAAJAAAAMYAAA

Oracle的物理扩展ROWID有18位,每位采用64位编码,分别用A~Z、a~z、0~9、+、/共64个字符表示。A表示0,B表示1,……Z表示25,a表示26,……z表示51,0表示52,……,9表示61,+表示62,/表示63。

ROWID具体划分可以分为4部分。

(1).OOOOOO:前6位表示DATA OBJECT NUMBER,将起转化位数字后匹配DBA_OBJECTS中的DATA_OBJECT_ID,可以确定表信息。

如上面例子中的DATA OBJECT NUMBER是AAAO0D,转化位数字是14×64×64 +52×64 + 3。
输入以下查询:
select owner, object_name from dba_objects where data_object_id = 14*64*64 + 52*64 + 3;
返回:
OWNER    OBJECT_NAME
WG             TEST_ROWID
(2)FFF:第7到9位表示相对表空间的数据文件号。
上面的例子中是AAJ,表示数据文件9。
输入以下查询:
(3).BBBBBB:第10到15位表示这条记录在数据文件中的第几个BLOCK中。

上面的例子是AAAAMY,转化位数字是12×64+24,表示这条记录在数据文件中的第792个BLOCK。

(4).RRR:最后3位表示这条记录是BLOCK中的第几条记录。

上面的例子是AAA,表示第0条记录(总是从0开始计数)。

四.参考资料

1.oracle rowid
2.Oracle基本数据类型存储格式浅析(四)——ROWID类型(一)
3.oracle数据文件为什么存在 Rfile# and file#

0
5
分享到:
评论

相关推荐

    oracle个人总结

    Oracle数据库是世界上最广泛使用的数据库管理系统之一,主要用于存储和管理企业级的数据。以下是对Oracle的一些关键知识点的详细说明: 1. **登陆与用户管理**: - 使用`sqlplus`命令行工具,通过`conn 用户名/...

    Oracle数据库经典学习教程

    通过上述知识点的总结,可以发现《Oracle数据库经典学习教程》全面地覆盖了Oracle数据库的基础知识、SQL语言、数据库对象管理、程序设计等方面的内容。无论是初学者还是有一定经验的技术人员都能从中受益匪浅。希望...

    Oracle数据库学习指南

    1. 《Oracle8 优化技术》摘录 (第一章 安装) 2. 《Oracle8 优化技术》摘录 (第二章 内存-CPU) 3. 《Oracle8 优化技术》摘录 (第三章 输入-输出) 4. EXP、IMP 命令详解 5. Oracle Index 的三个问题 6. ...

    Oracle大总结(达内培训笔记)

    ### Oracle大总结...以上内容总结了达内培训期间关于Oracle的学习笔记,详细介绍了数据库的基本概念、SQL语言的基础知识以及相关的高级特性。希望这些知识点能够帮助读者更好地理解和掌握Oracle数据库的相关技术。

    Oracle的游标学习

    Oracle的游标是数据库开发中的一个重要概念,尤其在PL/SQL编程中,游标用于处理SQL查询结果集,使得我们能够逐行处理数据,而不仅仅局限于一次性获取所有数据。在这个主题中,我们将深入探讨游标的定义、类型、使用...

    Oracle-sql-Performance-Tuning-30Tips.rar_oracle_tom kyte

    "Oracle SQL Performance Tuning 39Tips" 提供了由Oracle专家Tom Kyte精心总结的30个SQL优化技巧,这些技巧旨在帮助用户提升数据库查询速度,减少资源消耗,提高系统整体性能。 1. **索引优化**:Tom Kyte强调了...

    ORACLE学习手册和案例

    ### ORACLE学习手册和案例知识点总结 #### 一、ORACLE基础知识 ##### 1.1 ORACLE OLAP与OLTP介绍 **1.1.1 什么是OLTP** OLTP(Online Transaction Processing,在线事务处理)是针对业务系统的日常运作而设计的...

    Oracle经典教程

    - 通过本章的学习,读者能够对Oracle数据库有一个初步的认识,并掌握基本的操作方法。 ### 第二章:SQL数据操作和查询 **2.1 SQL简介** - **定义:** - SQL(Structured Query Language)是一种标准化的语言,...

    Oracle学习文档

    根据提供的文档内容,我们可以归纳总结出以下几个重要的Oracle数据库学习知识点: ### 1. SQL 查询技巧 #### 1.1 统计每个部门员工的数量 - **语法**: `SELECT dept_id, COUNT(*) FROM s_emp GROUP BY dept_id;` -...

    Oracle技术大牛《Oracle 学习手册》

    Oracle技术大牛所编写的《Oracle 学习手册》是涵盖了上千页的详细文档,...整体上,《Oracle 学习手册》是一份详尽且有深度的学习资料,对于想要深入学习Oracle数据库的人员,尤其是初学者来说,是一本宝贵的参考资料。

    Oracle经典教程.docx

    ### Oracle经典教程知识点总结 #### 第一章:走进Oracle - **Oracle简介** - Oracle是一种基于对象的关系型数据库管理系统,由甲骨文公司开发。它以表格形式组织数据,并结合了面向对象的设计思想。 - Oracle...

    oracle学习笔记

    从给定的文件信息来看,这是一份关于Oracle学习的手册,主要涵盖了Oracle的基础知识,包括OLAP与OLTP的概念,以及对索引的详细解释。以下是对这些知识点的深入探讨: ### ORACLE OLAP与OLTP介绍 #### 1.1.1 什么是...

    Oracle常用语法3

    以上是基于提供的文件信息总结出来的Oracle数据库知识点,涵盖了数据导出、数据导入、DUAL 表以及ROWID和ROWNUM的相关概念和使用方法。这些知识点对于Oracle数据库的学习和日常管理工作非常重要。

    Oracle与excel的互换.docx

    - **Oracle数据库学习之路**:介绍Oracle数据库的基础概念、操作技巧等。 - **数据库空间查询**:提供SQL脚本帮助查询Oracle数据库的空间使用情况。 - 表空间总体使用情况。 - 用户下所用空间统计。 - 特定用户下...

    Oracle经典教程1——走进Oracle

    通过本章的学习,读者应该能够对Oracle有一个初步的认识,并掌握安装和管理Oracle数据库的基本技能。 ### SQL数据操作和查询 #### SQL简介 SQL(Structured Query Language,结构化查询语言)是一种用于管理和...

    oracle学习详解

    以上是对Oracle学习文档中部分基础内容的总结。Oracle作为一款功能强大的关系型数据库管理系统,涉及的知识点众多且深入。在学习过程中,建议结合实际项目经验和案例,逐步深入理解和掌握其核心概念和技术细节。

    提升百倍效率-Oracle数据库性能

    总结,提升Oracle数据库性能是一个综合性的过程,涉及到SQL优化、数据库参数配置、物理存储设计、监控与维护、数据库设计等多个层面。通过深入理解和应用这些知识点,能够有效提升数据库效率,实现业务的高效运行。...

    Oracle学习手册

    ### Oracle学习手册知识点总结 #### 一、Oracle基础知识 ##### 1.1 OLAP与OLTP介绍 **1.1.1 什么是OLTP** OLTP(Online Transaction Processing,在线事务处理)是一种主要面向业务应用的数据处理方式,主要用于...

Global site tag (gtag.js) - Google Analytics