`
bruce198
  • 浏览: 236279 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

oracle8的ROWID结构

阅读更多

1、为什么使用ROWID  
ORACLE把ROWID作为B-树和其内部算法标示ROW的唯一标示。  
在ORACLE8以前的版本中,ROWID标示FILE、BLOCK、ROW NUMBER,只用一个数

字代  
表FILE号。  
在ORACLE8中,一个DATAFILE有两个数字代表:  
一个绝对值,是整个数据库唯一的。可以看DBA_DATA_FILES中的FILE_ID。  
一个相对值,在TABLESPACE中是唯一的,可以看DBA_DATA_FILES中的

RELATIVE_  
FNO。  

新的ROWID使用相对值,所以必须存放SEGMENT的标示,否则就会混淆。所以

ORAC  
LE8在ROWID中加入对象的SEGMENT号,用来标示TABLE或者PARTITION。  

2、ROWID的结构 
使用base-64代码,包括a-z,A-Z,0-9,+,-。一共18位。  
1-6位:代表OBJECT  
7-9位:文件相对值  
10-15:文件中的BLOCK  
16-18:BLOCK中的SLOT值  

3、TABLESPACE-Relative寻址方式  
使用的是TABLESPACE-Relative寻址方式,多个文件可以有相同的相对值,因

为它  
们属于不同的TABLESPACE,所以不能从新的ROWID得到绝对地址,但是这没有

问题  
,因为当要处理某个OBJECT时,已经能确定它属于哪个TABLESAPCE了。在

TABLES  
PACE中,文件相对值是唯一的,所以ROWID还是可以唯一标示一个OBJECT。

TABLE  
SPACE-Relative寻址方式是ORACLE8中支持超大数据库的关键技术。  

4、DATA OBJECT NUMBER  
DATA OBJECT NUMBER用于指示SEGMENT,所有SEGMENT都有DATA OBJECT NUMBER

,  
存放在每个DATA BLOCK中,而且不重复。  

最开始的时候,DBA_OBJECTS.OBJECT_ID=DBA_OBJECTS.DATA-OBJECT_ID,但是

在  
上述情况下DATA-OBJECT_ID会在如下情况下增加  
TRUNCATE TABLE  
MOVE PARTITION  
ORACLE会检查ROWID中的DATA OBJECT NUMBER和BLOCK中的DATA OBJECT NUMBER

,  
保证他们之间的版本是一致的。  
ORACLE也使用DATA OBJECT NUMBER以确保ROLLBACK的纪录和最新的SEGMENT纪

录一  
致。  
要注意的是DATA OBJECT NUMBER不是OBJECT 的标志  


5、RESTRICTED ROWID  
ORACLE7的ROWID格式是  
1-8位:BLOCK NUMBER  
9-12位:ROW NUMBER  
13-16位:FILE NUMBER  
ORACLE8支持短的、旧格式的ROWID,作用是  
对NOPARTITION TABLE的INDEX ENTRY  
对PARTITION TABLE的LOCAL INDEX ENTRY  
ROW Piece CHain pointer  
受限ROWID的内部存放是6BYTE,  
4BYTE=DATA BLOCK NUMBER  
2BYTE=ROW NUMBER  
这就是说,INDEX ENTRY使用6BYTE存放该ROWID,这对大多数INDEX足够了。但

是  
这种短ROWID不能使用在PATITION TABLE的GLOBAL INDEX上,因为PARTITION可

能  
跨TABLESPACE。显示这种ROWID依然是18位的  

6、扩展的ROWID  
ORACLE在内部存放时候是10 BYTE,包括(DATA OBJECT NUMBER,DATA BLOCK

NU  
MBER,ROW NUMBER)  
ORACLE8使用扩展的ROWID:  
PARTITION TABLE 的GLOBAL INDEX  
SERVER 算法  
扩展的ROWID在SELECT时,依然是18位的显示,存放在ROWID字段中。  

7、在ORACLE8中使用ORACLE7的ROWID  
从ORACLE8的DB中查询ORACLE7的ROWID时候,ROWID返回的是ORACLE7的格式,

也可  
以用在WHERE语句中。  
从ORACLE7的DB中查询ORACLE8的ROWID时候,ROWID返回的是ORACLE8的格式,

也可  
以用在WHERE语句中,但是不能存放在ROWID字段中。但是你要用DBMS_ROWID

包来  
解释之。  
如果包含扩展的ORACLE8 ROWID,这不能把ORACLE8的数据IMPORT到ORACLE7中

。从  
ORACLE7中可以IMPORT到ORACLE8中。  

8、APPLICATION的移植问题  
一般程序的移植应该没有问题。只有在下面情况下才考虑移植问题:  
application使用了rowid  
table包括ROWID类型的字段  
如果程序有如下情况,必须使用DBMS_ROWID包:  
自己组合ROWID  
自己分解ROWID  
如果仅仅是传递ROWID到变量、或者仅仅做为一个整体使用,则可以不受影响

。  


9、数据的移植问题  
无论使用EXPORT/IMPORT还使用移植工具,ORACLE7中的ROWID字段到了ORACLE8

中  
就自动扩展。  
如果在某个字段内容中包含ROWID,则必须手工用DBMS_ROWID包来转换。  

10、DBMS_ROWID包  
由$ORACLE_HOME/rdbms/admin/dbmsutil.sql创建,其实在catproc.sql中包含

着  
。提供处理ROWID的一些函数。  
ROWID_CREATE  
ROWID_INFO  
ROWID_TYPE  
ROWID_OBJECT  
ROWID_RELATIVE_FNO  
ROWID_BLOCK_NUMBER  
ROWID_TO_ABSOLUTE_FNO  
ROWID_TO_EXTENDED  
ROWID_TO_RESTRICTED  
ROWID_VERIFY  

 

DBMS_ROWID.ROWID_TO_EXTENDED  
(old_rowid in ROWID,  
schema_name in varchar2,  
object_name in varchar2,  
conversion_type in number  
)  
RETURN ROWID;  
转换受限rowid到扩展rowid,用于转换旧的ROWID到ORACLE8的格式。  


DBMS_ROWID.ROWID_TO_RESTRICTED  
转换扩展的ROWID到受限的ROWID。  

DBMS_ROWID.ROWID_VERIFY  
判断一个受限的ROWID是否可以转换到扩展的格式  


DBMS_ROWID.ROW_INFO  
用于解释ROWID,可以得到DATA OBJECT NUMBER,RELATIVE FILE

NUMBER,BLOCK  
NUMBER和ROW NUMBER。  

DBMS_ROWID.CREATE  
生成ROWID。

分享到:
评论

相关推荐

    Oracle数据库rowid深入探析.pdf

    "Oracle数据库rowid深入探析" Oracle数据库rowid是Oracle数据库中一个重要的概念,也是Oracle DBA考试中一个重要的知识点。rowid是Oracle数据库中的一种伪列,它可以唯一地标识表中的每一行。伪列类似于数据表的列...

    Oracle的表结构转成Mysql的表结构

    - **不支持的功能**:此函数目前不支持Oracle中的分区、函数索引、位图索引等特殊索引定义、自定义数据类型、ROWID、RAW等特殊数据类型、外键以及自定义约束。 - **数据类型转换**:Oracle中的`DATE`和`TIMESTAMP`...

    Oracle中的rowid

    ROWID并非实际存在于表结构中,而是一个由Oracle自动生成的伪列,它根据数据行的物理存储位置编码而成。通过ROWID,可以直接定位到数据行的物理地址,从而实现快速的数据访问。 ROWID的结构包含四个主要部分,分别...

    oracle error invalid rowid

    2. **表结构变动**:如果你对表进行了重定义,如添加、删除或修改列,或者改变了表的分区,这可能导致原有的RowID不再指向有效的数据。在这些操作后,任何基于旧RowID的查询都将失败。 3. **表空间问题**:如果涉及...

    Oracle和数据结构

    Oracle使用行标识符(ROWID)来唯一标识每一行。 3. 列(Column):列定义了表中的字段,每个列都有一个名字、数据类型和可能的约束条件,如非空(NOT NULL)、主键(PRIMARY KEY)或外键(FOREIGN KEY)。 4. ...

    oraclerowid在表行中的物理标识.pdf

    ROWID由一系列的十六进制数字组成,包含数据对象编号、文件编号、块编号以及行编号,这四个部分共同构成了ROWID的完整结构。 1. 数据对象编号(OBJECT): ROWID的前六个字符代表数据对象编号,这是一个全局唯一的...

    rowid与rownumber

    长 ROWID 是 Oracle 8 及更高版本的默认 ROWID,包括 18 位的 base-64 编码字符串。短 ROWID 是 Oracle 7 的默认 ROWID,包括 6 字节的内部存储结构。 五、rowid 的应用 rowid 可以用于各种数据库操作,例如: * ...

    试论Rowid在Oracle数据库中的应用.pdf

    Oracle数据库中Rowid是一个非常重要的概念,它代表了数据库中记录的唯一地址标识。每行记录在Oracle数据库中都会有一个Rowid,相当于一个物理地址,即使该行数据在数据库中发生了迁移,其Rowid也不会改变。在处理...

    oracle_SQL中ROWID与ROWNUM的使用

    ### Oracle SQL中ROWID与ROWNUM的使用 #### ROWNUM 的使用——TOP-N 分析 在 Oracle SQL 中,`ROWNUM` 是一种特殊的伪列,用于标识查询结果集中的行编号。它常用于实现 TOP-N 查询,即返回结果集中满足特定条件的...

    浅析Rowid在Oracle数据库中的应用.pdf

    在Oracle8及以后版本中,Physical Rowid通常指的是扩展Rowid,以适应更高的数据存储需求和兼容性。 Rowid的显示形式直观且包含丰富的信息。一个Rowid由18个字符组成,分为4部分:对象(Object)、文件(File)、块...

    Oracle8-数据库系统.ppt

    Oracle8 数据库系统索引 Oracle8 数据库系统索引是数据库性能的关键组件之一。索引的主要作用是快速找到表记录,从而提高数据库应用的性能。Oracle8 数据库系统提供了多种类型的索引,包括 B 树索引、位图索引、簇...

    Oracle 表结构.pdf

    Oracle 表结构是数据库管理系统中数据组织的基本形式,它以二维表格的形式存储和管理数据。在Oracle数据库中,创建表时需要定义一系列字段(或称为列),每个字段都有其特定的属性,如字段名、数据类型、长度、约束...

    Oracle8i_9i数据库基础

    ### Oracle8i_9i数据库基础知识点概览 #### 一、理解关系数据库系统(RDBMS) ##### 1.1 关系模型 - **定义**:关系模型是一种用于描述数据库中数据及其相互之间联系的数据模型。它以表格形式组织数据,并通过表格...

    《Oracle8i数据库管理员手册》读书笔记.docx

    Oracle8i的体系结构分为三个主要部分:数据库内部结构、存储区内部结构和数据库外部结构。数据库内部结构主要包括数据库对象,如表、索引等;存储区内部结构涉及共享存储区(SGA)和进程,其中SGA包含了数据块缓存区...

    Oracle8数据库系统.ppt

    Oracle8数据库系统是Oracle公司的一款历史悠久的数据库管理系统,它提供了高效的数据存储和管理能力。在Oracle8中,数据库性能优化是关键,而索引作为提升数据检索速度的重要工具,占据了非常重要的地位。 首先,...

    Oracle 表结构.docx

    总结来说,理解Oracle中的`CHAR`、`BLOB`、`CLOB`、`BFILE`数据类型以及`ROWID`的概念是设计高效、灵活的数据库表结构的关键。在创建表时,根据数据的特性和需求选择合适的数据类型,可以有效提升数据库的性能和存储...

    Oracle8i_9i数据库基础-WORD版

    - **伪列及伪表**:伪列是Oracle提供的特殊列,如ROWID,用于标识表中的行。伪表则是系统自动生成的表,如DUAL。 - **使用SQLWorksheet工作**:SQLWorksheet是一个图形界面工具,允许用户编写和执行SQL命令,并查看...

Global site tag (gtag.js) - Google Analytics