Oracle Rowid 介绍

2024-03-21 18:38
文章标签 oracle 介绍 rowid

本文主要是介绍Oracle Rowid 介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Oracle Rowid 介绍

  (2011-10-15 15:19:41)
转载
标签: 

杂谈

 
DBMS_ROWID是一个比较有用的系统自带的package,主要可以用来处理坏块的问题,于是仔细的研究了一下,这个包可以用来了解fileblockobject_idrowid之间的关系,在Oracle8中被引用进来,Oracle7不支持这个包。这个包的定义可以在dbmsutil.sql中找到,在catproc.sql中被调用,并被给予public执行权限。
1)FUNCTION ROWID_BLOCK_NUMBER RETURNS NUMBER
SQL> select dbms_rowid.rowid_block_number(rowid) from dept;

DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
------------------------------------
                                  16
                                  16
                                  16
                                  16
                                  12
                                  12
2)FUNCTION ROWID_CREATE RETURNS ROWID
创建restricted  rowid:
SQL> select dbms_rowid.rowid_create(0,51149,4,16,0) from dual;

DBMS_ROWID.ROWID_C
------------------
00000010.0000.0004
创建extented rowid:
SQL> select dbms_rowid.rowid_create(1,51149,4,16,0) from dual;

DBMS_ROWID.ROWID_C
------------------
AAAMfNAAEAAAAAQAAA
3)PROCEDURE ROWID_INFO
返回一个单独组件的一个指定的rowid,它只能用于PL/SQL,而不能用于sql语句中。
4)FUNCTION ROWID_OBJECT RETURNS NUMBER
返回一个rowid的对象号。如果是restricted 的rowid,则返回0
5)
DBMS_ROWID.ROWID_VERIFY:
  验证一个restrictedrowid是否能够转换成extendedrowid,它可以用来发现存在问题的rowid

6) DBMS_ROWID.ROWID_TO_EXTENDED:
 
转换一个restricted rowid为一个extended rowid.如果原始的rowid存储在列中,转换的 就是internal类型;如果原始的rowid是以字符串形式存储的,那转换的就是external类型。

7) DBMS_ROWID.ROWID_TO_RESTRICTED:
  转换一个extenededrowid为一个restrictedrowidrestrictedrowid格式为BBBBBBB.RRRR.FFFFF, BBBBBBB代表blockRRRR 代表在block中的行号,从0开始,FFFFF代表文件号。这个包可以使用rowid或者rowid转换类型(ROWID_CONVERT_INTERNAL (0)ROWID_CONVERT_EXTERNAL (1)

2.2 . Rowid的结构

 

 

 

 

ROWID 格式:

       扩展的ROWID 在磁盘上需要10 个字节的存储空间,并使用18 个字符来显示。

 

它包含下列组成元素:

       1. 数据对象编号:每个数据对象(如表或索引)在创建时都分配有此编号,并且此编号在数据库中是唯一的

       2. 相关文件编号:此编号对于表空间中的每个数据文件是唯一的

       3. 块编号:表示包含此行的块在数据文件中的位置

       4. 行编号:标识块头中行目录位置的位置

 

在内部,存储的10个字节(bytes),即80(bit)又按如下规则进行划分:

       1)数据对象编号需要32 bit

       2)相关文件编号需要10 bit

       3)块编号需要22 bit

       4)行编号需要16 bit

 

 

       oracle 8以前,一个rowid占用6个字节大小的存储空间(10bit file#+22bit block#+16bit row#), rowid格式为:BBBBBBBB.RRRR.FFFF

       oracle 8以后, rowid的存储空间扩大到了10个字节(32bit object#+10bit rfile#+22bit block#+16bit row#),文件号仍然用10位表示,只是不再需要置换,为了向后兼容,同时引入了相对文件号(rfile#),所以从Oracle7Oracle8,Rowid仍然无需发生变化.

 

       Rdba(Tablespace relative database block address)就是rowid中的rfile#+block#.

 

       rowid这样改变之后,数据库中数据库文件个数的限制从整个数据库最多只能有的2^10-2=1022个数据文件(去掉全0和全1), 变为了每个表空间中可以最多2^10-2个数据文件。

       所以说,数据库能支持的数据文件最大数是受rowid的长度限制的。

 

       需要注意的是: local index中存储的rowid6个字节,而global index中存储的rowid10个字节。

 

       那么增加的32bit object# 这个前缀主要就是用来定位表空间的,同时这个object#其实对应的就是data_object_id,由于一个段对象只能属于一个表空间,同时data_object_id就是标识了一个段的物理存储id.因此object#+rfile#就可以唯一定位当前的rowid是在那个数据文件上了。

 

 

可以通过dbms_rowid这个包来转换我们的rowid成不同组成部分:

       dbms_rowid.rowid_object(rowid)---> 32bit object#
       dbms_rowid.rowid_relative_fno(rowid)---> 10bit rfile#
       dbms_rowid.rowid_block_number(rowid)---> 22bit block#
       dbms_rowid.rowid_row_number(rowid)---> 16bit row#

 

       扩展的ROWID 使用以64 为基数的编码方案来显示,该方案将六个位置用于数据对象编号、三个位置用于相关文件编号、六个位置用于块编号、三个位置用于行编号。

       64 为基数的编码方案使用字符“A-Z”、“a-z”、“0-9 和“/”。共有64 个字符,如下例所示:

 

SQL> SELECT department_id, rowid FROM hr.departments;

     EMPNO ROWID            

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

      7488 AAAMfPAAEAAAAAgAAA

      7499 AAAMfPAAEAAAAAgAAB

      7521 AAAMfPAAEAAAAAgAAC

      7566 AAAMfPAAEAAAAAgAAD

      7654 AAAMfPAAEAAAAAgAAE

      7698 AAAMfPAAEAAAAAgAAF

      7782 AAAMfPAAEAAAAAgAAG

      7788 AAAMfPAAEAAAAAgAAH

      7839 AAAMfPAAEAAAAAgAAI

      7844 AAAMfPAAEAAAAAgAAJ

      7876 AAAMfPAAEAAAAAgAAK

      7900 AAAMfPAAEAAAAAgAAL

 

在本例中:

       AAAMfP 是数据对象编号

       AAE 是相关文件编号

       AAAAAg是块编号

       AAAEMPNO=7488 的部分的行编号

这篇关于Oracle Rowid 介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/833546

相关文章

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

Oracle存储过程里操作BLOB的字节数据的办法

《Oracle存储过程里操作BLOB的字节数据的办法》该篇文章介绍了如何在Oracle存储过程中操作BLOB的字节数据,作者研究了如何获取BLOB的字节长度、如何使用DBMS_LOB包进行BLOB操作... 目录一、缘由二、办法2.1 基本操作2.2 DBMS_LOB包2.3 字节级操作与RAW数据类型2.

Python实现html转png的完美方案介绍

《Python实现html转png的完美方案介绍》这篇文章主要为大家详细介绍了如何使用Python实现html转png功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 1.增强稳定性与错误处理建议使用三层异常捕获结构:try: with sync_playwright(

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir

查看Oracle数据库中UNDO表空间的使用情况(最新推荐)

《查看Oracle数据库中UNDO表空间的使用情况(最新推荐)》Oracle数据库中查看UNDO表空间使用情况的4种方法:DBA_TABLESPACES和DBA_DATA_FILES提供基本信息,V$... 目录1. 通过 DBjavascriptA_TABLESPACES 和 DBA_DATA_FILES

JAVA SE包装类和泛型详细介绍及说明方法

《JAVASE包装类和泛型详细介绍及说明方法》:本文主要介绍JAVASE包装类和泛型的相关资料,包括基本数据类型与包装类的对应关系,以及装箱和拆箱的概念,并重点讲解了自动装箱和自动拆箱的机制,文... 目录1. 包装类1.1 基本数据类型和对应的包装类1.2 装箱和拆箱1.3 自动装箱和自动拆箱2. 泛型2

Oracle登录时忘记用户名或密码该如何解决

《Oracle登录时忘记用户名或密码该如何解决》:本文主要介绍如何在Oracle12c中忘记用户名和密码时找回或重置用户账户信息,文中通过代码介绍的非常详细,对同样遇到这个问题的同学具有一定的参... 目录一、忘记账户:二、忘记密码:三、详细情况情况 1:1.1. 登录到数据库1.2. 查看当前用户信息1.

oracle DBMS_SQL.PARSE的使用方法和示例

《oracleDBMS_SQL.PARSE的使用方法和示例》DBMS_SQL是Oracle数据库中的一个强大包,用于动态构建和执行SQL语句,DBMS_SQL.PARSE过程解析SQL语句或PL/S... 目录语法示例注意事项DBMS_SQL 是 oracle 数据库中的一个强大包,它允许动态地构建和执行