`

oracle rowid 解析

阅读更多

 

rowid定义:

每一个表中都有一列rowid(iot表除外),每一行的rowid代表了该行在数据库中存储的实际地址。rowid是伪列(pseudocolumn),伪劣的意思是实际上这一列本身在数据字典中并不存在,在查询结果输出时它被构造出来的。在操作上它和普通的列也有一些差别:不能通过desc以及select直接显示出来,除非显式说明,rowid不能做表的primarykey ,也不能对rowid执行dml操作。

 

 SQL> select  rowid ,

             substr(rowid ,1,6) data_object_id ,

             substr(rowid ,7,3)rfile#,substr(rowid,10,6) block_id,

             substr(rowid ,16,3) bject_rowid  from GEDB.CMSADMIN  

     where rownum <2;


ROWID             DATA_OBJECT_ID        RFILE#    BLOCK_ID        OBJECT_ID 

---------------                         ------------            ------       ------------                   ------ 

AAAi8dAAEAAAxi0AAA      AAAi8d           AAE        AAAxi0                   AAA 


 

这里显示出来的是64进制数,oracle在设计rowid时用A~Z表示0-25,用a~z表示26-51,用0~9表示52-61,用+表示62,用/表示63。

即:AAAi8d========> A =0  A=0  A=0  i = 34  8 = 60  d= 29

 

SQL> select34*power(64,2) + 60*64 + 29 from dual ;


34*POWER(64,2)+60*64+29

                   ----------------------

                               143133


 

SQL> selectobject_id , data_object_id from dba_objects where object_name='CMSADMIN' andowner='GEDB';


OBJECT_ID      DATA_OBJECT_ID

----------                          --------------

143133                             143133


 可以用同样的方法计算 RFILE# ,BLOCK_ID , BJECT_ID


oracle还提供了一个package:dbms_rowid,利用dbms_rowid中的几个函数可以很容易的把rowid拆分成10进制数:

SQL> select dbms_rowid.rowid_object('AAAi8dAAEAAAxi0AAA')   objectid , 

     dbms_rowid.rowid_relative_fno('AAAi8dAAEAAAxi0AAA')    fileno,

     dbms_rowid.rowid_block_number('AAAi8dAAEAAAxi0AAA')    blockid ,

     dbms_rowid.rowid_row_number('AAAi8dAAEAAAxi0AAA')      rowno  

     from  dual ;


OBJECTID    FILENO         BLOCKID          ROWNO|

----------         ----------              ----------           ---------- 

    143133         4                  202932                   0 


 

dbms_row中还有几个非常有用的函数:

参见:  http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_rowid.htm 

 

ROWID_TO_ABSOLUTE_FNO(rowid)  可以实现rfile#(相对文件号) 到file#(绝对文件号)的转化。

This functionextracts the absolute file number from a ROWID, where the file number isabsolute for a row in a given schema and table. The schema name and the name ofthe schema object (such as a table name) are provided as IN parametersfor this function.

 

ROWID_TO_EXTENDED 可以实现从restricted rowid到extended rowid的转化。

This functiontranslates a restricted ROWID that addresses a row in a schema andtable that you specify to the extended ROWID format. Later, it may beremoved from this package into a different place.

 

 ROWID_CREATE   可以实现创建一个rowid 

This function lets you create a ROWID, given the component parts as parameters.

This is useful fortesting ROWID operations, because only the Oracle Server can create a validROWID that points to data in a database.

语法:

DBMS_ROWID.ROWID_CREATE(

                  rowid_type    IN NUMBER,   

                  object_number IN NUMBER,

                  relative_fno IN NUMBER,

                  block_number IN NUMBER,

                  row_number    IN NUMBER) 

           RETURN ROWID;


参数的描述:

rowid_type 

Type (restricted or extended). Set the rowid_typeparameter to 0 for a restricted ROWID. Set it to 1 to create an extended ROWID.

If you specify rowid_type as 0, then the required object_numberparameter is ignored, and ROWID_CREATE returns a restricted ROWID.

object_number    Dataobject number (rowid_object_undefined for restricted). 

relative_fno         Relative file number. 

block_number     Block number in this file. 

row_number        Returns row number in this block.

 

用这个的作用:

数据块损坏,如果是用户查询某个表报block损坏的时候可以通过block算出具体的行

 

2)查询被锁定的具体行是会用到,请参考另一个文章:如果查询被锁定的具体行

如何查询被锁的对象请参加:

 http://hi.baidu.com/wa0362/blog/item/4e06aa87f732732cc75cc33a.html 

 

分享到:
评论

相关推荐

    Oracle中的rowid

    此外,还可以使用Oracle的内置存储过程来解析ROWID,以获取更详细的信息。 总的来说,理解ROWID对于优化Oracle数据库的操作至关重要,无论是进行快速的数据访问还是分析数据存储结构。掌握ROWID的使用和解析,有助...

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

    比如,dbms_rowid包提供了多个函数,可以帮助我们构建和解析Rowid。通过这些函数,我们可以编写脚本实现复杂的数据处理逻辑。 了解和利用Rowid对于提升数据库性能,优化SQL查询语句以及进行数据库管理都有极大的...

    oracle数据块解析

    Oracle 数据块解析是理解 Oracle 数据库内部工作原理的关键部分。数据块是数据库进行最小 I/O 操作的单位,它包含了存储在表、索引和其他数据库对象中的数据。在这个过程中,我们将通过一系列步骤来了解数据块的内部...

    oracle_SQL-rowid--rownum.zip_oracle

    在Oracle SQL中,`ROWID`和`ROWNUM`是两个非常重要的概念,它们在数据库查询和操作中扮演着关键角色。本篇文章将详细解析这两个概念及其应用。 **ROWID** `ROWID`是Oracle数据库中一个特殊的伪列,它为每一行数据...

    Oracle Sql 性能优化

    ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表...

    Oracle 索引解析

    本文将详细解析Oracle 11g中几种关键的索引类型,包括B-tree索引、反向索引、降序索引、位图索引以及函数索引等。 B-tree索引是Oracle中最常使用的一种索引类型,它的结构基于二叉树,其构成包括分支块和叶子块。在...

    ORACLE 优化sql语句提高oracle执行效率 .doc

    1. 选择最有效率的表名顺序:在基于规则的优化器中,Oracle 的解析器按照从右到左的顺序处理 FROM 子句中的表名。因此,在包含多个表的连接查询中,需要选择记录条数最少的表作为基础表。如果有三个以上的表连接查询...

    oracle SQL优化技巧

    在基于规则的优化器中,Oracle 的解析器按照从右到左的顺序处理 FROM 子句中的表名。因此,在 FROM 子句中写在最后的表(基础表)将被最先处理。在 FROM 子句中包含多个表的情况下,需要选择记录条数最少的表作为...

    oracle标准库函数

    在Oracle中,DBMS_ROWID是一个非常重要的包,它提供了对ROWID的处理和解析,ROWID是Oracle用来唯一标识表中每一行的一个物理地址。下面将详细介绍这个包的功能以及与之相关的Oracle知识点。 DBMS_ROWID包包含了一...

    数据库面试题3 oracle笔试 oracle例题

    ### 数据库面试题3:Oracle笔试与Oracle例题解析 #### 一、选用适合的Oracle优化器 在Oracle数据库管理中,优化器的选择对于SQL查询的执行效率至关重要。Oracle提供了三种不同的优化器模式: 1. **基于规则的优化...

    oracle的一些相关网页介绍

    "oraclesequence_百度百科.mht"可能会详细解析如何创建和使用序列,以及序列在保持数据唯一性、避免并发问题等方面的角色。 这些网页资料涵盖了Oracle数据库中关键的元素,对于理解Oracle数据库的操作和管理至关...

    Oracle+SQL性能优化40条.docx

    * Oracle 在解析 SQL 语句的时候,对于“*”将通过查询数据库字典来将其转换成对应的列名 * 建议列出所有的 Column 名称,而不是简单的用“*”来替代 八、减少访问数据库的次数 * 执行每条 SQL 语句时,Oracle 在...

    oracle性能优化总结.pdf

    为了减少重复解析SQL语句带来的开销,Oracle会在系统全局区(SGA)的共享池中缓存已解析的SQL语句及其执行计划。这种方式称为共享SQL语句,它可以显著提高SQL执行的性能并减少内存使用。 - **字符级的比较**:共享...

    Oracle常用语法3

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

    Oracle SQL语句性能优化

    Oracle的共享SQL语句机制存储解析后的语句在SGA的共享池中,减少解析开销,提高执行效率。相同的SQL语句(包括空格、换行等)会被视为同一个语句进行共享。但多表连接查询不支持高速缓冲。数据库管理员需要合理配置...

    Oracle动态性能表.doc

    Oracle动态性能表是数据库管理员用来监控Oracle数据库性能的关键工具,其中包含了多个系统状态指标,能够帮助我们理解数据库的运行情况并进行性能优化。以下是一些主要的性能指标及其含义: 1. CPU used by this ...

    ORACLE 中 SQL语句优化总结

    在基于规则的优化器中,ORACLE 的解析器按照从右到左的顺序处理 FROM 子句中的表名。如果有多个表连接查询,需要选择记录条数最少的表作为基础表。如果有三个以上的表连接查询,就需要选择交叉表(intersection ...

    Oracle语句优化53个规则详解

    为了减少SQL语句的重复解析和提高执行效率,Oracle提供了SQL语句共享机制。 1. **共享池**:在SGA(System Global Area)中有一个名为共享池的内存区域,用于存储已解析的SQL语句及其执行计划。这样,当相同的SQL...

    ORACLE与DB2的区别和转换

    - **解析**: Oracle中的ROWID是一种特殊的数据类型,可以唯一标识表中的每一行。DB2在v8版本中增加了对类似ROWID的支持,允许用户更方便地进行行级别的操作。 ##### 7. 数字转换 **Oracle**: `select to_number('...

Global site tag (gtag.js) - Google Analytics