`
junjie_2006
  • 浏览: 1034 次
  • 性别: Icon_minigender_1
  • 来自: 厦门...
最近访客 更多访客>>
社区版块
存档分类
最新评论

ORACLE ROWID

阅读更多

在8i以前rowid由file#+block#+row#组成,占用6个bytes的空间,10 bit 的 file# ,22 bit 的 block# ,16 bit 的 row#。
其中oracle 的dba(data block address)是32 bits的,包括10 bit 的 file# 和 22 bit 的block#。
由于不存在0编号文件,oracle中的文件最大数量2^10-1=1023
而datafile能达到的最大size就是2^22*db_block_size
如果db_block_size为4k的datafile max size就是16G
如果db_block_size为8k的datafile max size就是32G

从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个变成了每个data_object_id不能超过1023个数据文件。当然,你或许要问,
为什么oracle不调整rowid中表示 file# 的 bit数量,这个应该是由于兼容性的引起的,在 oracle7 的索引中存储的rowid
就是 file# + block# + row# ,因为这样处理后关于索引的存储,oracle8和oracle7没有发生变化。

虽然oracle使用了extend rowid,但是在普通索引里面依然存储了bytes的rowid,只有在global index中存储的是10bytes
的extend rowid,而extend rowid也是global index出现的一个必要条件。

我们可以用如下方法研究rowid的详细内容。

SQL> select dbms_rowid.ROWID_OBJECT(rowid) data_object_id#,
2 dbms_rowid.ROWID_RELATIVE_FNO(rowid) rfile#,
3 dbms_rowid.ROWID_BLOCK_NUMBER(rowid) block#,
4 dbms_rowid.ROWID_ROW_NUMBER(rowid) row#
5 from test where rownum<10;

DATA_OBJECT_ID# RFILE# BLOCK# ROW#
--------------- ---------- ---------- ----------
24382 8 90 0
24382 8 90 1
24382 8 90 2
24382 8 90 3
24382 8 90 4
24382 8 90 5
24382 8 90 6
24382 8 90 7
24382 8 90 8

9 rows selected


SQL> select dump(rowid,16) rid from test where rownum<10;

RID
--------------------------------------------------------------------------------
Typ=69 Len=10: 0,0,5f,3e,2,0,0,5a,0,0
Typ=69 Len=10: 0,0,5f,3e,2,0,0,5a,0,1
Typ=69 Len=10: 0,0,5f,3e,2,0,0,5a,0,2
Typ=69 Len=10: 0,0,5f,3e,2,0,0,5a,0,3
Typ=69 Len=10: 0,0,5f,3e,2,0,0,5a,0,4
Typ=69 Len=10: 0,0,5f,3e,2,0,0,5a,0,5
Typ=69 Len=10: 0,0,5f,3e,2,0,0,5a,0,6
Typ=69 Len=10: 0,0,5f,3e,2,0,0,5a,0,7
Typ=69 Len=10: 0,0,5f,3e,2,0,0,5a,0,8

9 rows selected

SQL> select dump(rowid) rid from test where rownum<10;

RID
--------------------------------------------------------------------------------
Typ=69 Len=10: 0,0,95,62,2,0,0,90,0,0
Typ=69 Len=10: 0,0,95,62,2,0,0,90,0,1
Typ=69 Len=10: 0,0,95,62,2,0,0,90,0,2
Typ=69 Len=10: 0,0,95,62,2,0,0,90,0,3
Typ=69 Len=10: 0,0,95,62,2,0,0,90,0,4
Typ=69 Len=10: 0,0,95,62,2,0,0,90,0,5
Typ=69 Len=10: 0,0,95,62,2,0,0,90,0,6
Typ=69 Len=10: 0,0,95,62,2,0,0,90,0,7
Typ=69 Len=10: 0,0,95,62,2,0,0,90,0,8

9 rows selected

ROWID的显示规则:

第1~6位表示data_object_id#第7~9位是表示的是数据文件,而10~15位表示的是在这个数据文件中的第几个BLOCK。rowid编码相当于64进制。
用A~Z a~z 0~9 + /共64个字符表示。A表示0,B表示1,……,a表示26,……,0表示52,……,+表示62,/表示63。

SQL> select dbms_rowid.ROWID_OBJECT(rowid) data_object_id#,
  2  dbms_rowid.ROWID_RELATIVE_FNO(rowid) rfile#,
  3  dbms_rowid.ROWID_BLOCK_NUMBER(rowid) block#,
  4  dbms_rowid.ROWID_ROW_NUMBER(rowid) row#,
  5  rowid
  6  from test where rownum<10;

DATA_OBJECT_ID#     RFILE#     BLOCK#       ROW# ROWID
--------------- ---------- ---------- ---------- ------------------
          24382          8         90          0 AAAF8+AAIAAAABaAAA
          24382          8         90          1 AAAF8+AAIAAAABaAAB
          24382          8         90          2 AAAF8+AAIAAAABaAAC
          24382          8         90          3 AAAF8+AAIAAAABaAAD
          24382          8         90          4 AAAF8+AAIAAAABaAAE
          24382          8         90          5 AAAF8+AAIAAAABaAAF
          24382          8         90          6 AAAF8+AAIAAAABaAAG
          24382          8         90          7 AAAF8+AAIAAAABaAAH
          24382          8         90          8 AAAF8+AAIAAAABaAAI

9 rows selected

看第一条数据:
24382 = AAAF8+ = 5 * 64^2 + 60 * 64 + 62
8 = AAI
90 = ABa = 1 * 64 +  26

分享到:
评论

相关推荐

    基于Oracle RowID实现批量数据的分页下载.pdf

    本文重点探讨了一种基于Oracle RowID实现批量数据分页下载的方法,这种方法可以有效提高效率并减少对数据库的压力。 RowID是Oracle数据库中用于唯一标识每一行数据的物理地址,它不是用户可见的列,但可以在SQL查询...

    mysql虚拟了一个rowid(类似跟oracle的rowid)--SQL语句.sql

    mysql虚拟了一个rowid(类似跟oracle的rowid)--SQL语句

    Oracle数据库rowid深入探析.pdf

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

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

    Oracle的ROWID是一个重要的概念,它是数据库中每一行记录的物理地址标识,允许快速定位到数据存储的具体位置。ROWID由一系列的十六进制数字组成,包含数据对象编号、文件编号、块编号以及行编号,这四个部分共同构成...

    Oracle学习笔记(rownum和rowid)

    Oracle学习笔记(rownum和rowid),有具体的代码案例讲解rownum和rowid

    Oracle中用Rowid查找和删除表中的重复记录

    ### Oracle中用Rowid查找和删除表中的重复记录 在Oracle数据库管理中,处理重复记录是一项常见的需求,尤其是在数据量较大的情况下。本文将详细介绍如何利用Rowid这一特性来有效地查找和删除表中的重复记录。 ####...

    Tianlesoftware Oracle 学习手册(v1.0)高清完整PDF版

    ROWID是Oracle中一种特殊的数据类型,用于表示数据库表中每条记录的物理地址。ROWID可以被用来快速定位到表中的特定行,因此对于基于ROWID的查询非常高效。 --- 以上是从Tianlesoftware Oracle 学习手册(v1.0)中...

    利用rowid快速在线更新海量数据

    **ROWID** 是 Oracle 数据库中一个非常重要的概念,它是一种特殊类型的列,用于唯一标识表中的一行数据。ROWID 的格式通常包含数据对象号 (Data Object Number)、相对文件号 (Relative File Number)、块号 (Block ...

    Oracle和DB2的数据类型比较

    Oracle的ROWID类型可以直接对应到DB2/400中的ROWID类型,但在使用时需注意功能上的细微差别。 综上所述,Oracle和DB2/400在数据类型上存在显著差异,特别是在日期时间类型、数值类型、字符类型和大对象类型方面。...

    Oracle索引优化相关

    ROWID在Oracle中是一种特殊的数据类型,可以通过它来快速访问特定的行。在需要检查重复值或其他与ROWID有关的操作时,可以在任何表中创建和使用ROWID列。 #### 四、限制索引 在实际应用中,一些开发人员可能会因为...

    odbc连接oracle11g数据库

    8. **ODBC连接ORC**:这里的“ORC”可能是指Oracle的数据类型,如Oracle ROWID,ODBC驱动程序需要正确处理这些特定于Oracle的数据类型。 9. **文档的重要性**:压缩包中包含的使用文档是宝贵的资源,很可能记录了...

    oracle资料(比较全)

    文档中还提到了Oracle Rowid的概念,Oracle Rowid是Oracle数据块中的一个伪列,它包含了指向数据行存储位置的唯一地址。在某些情况下,可以用来优化查询操作。 文档的作者在学习Oracle数据库的过程中,参考了多位...

    ORACLE学习手册和案例

    ROWID是Oracle中的一种特殊数据类型,表示表中每一行的物理地址。通过ROWID可以直接定位到具体的物理位置,因此可以极大地提高查询效率。 综上所述,本文档通过对Oracle的基础知识进行了深入的探讨,特别是对OLTP和...

    Oracle很详细的讲解

    1.2.9 Oracle ROWID:每个Oracle表都具有一个伪列ROWID,代表每行数据在数据库中的唯一物理地址,对于优化查询和维护数据块非常有用。 1.2.10 选择性:索引的“选择性”是指不同值占总行数的比例,选择性越高,...

    oracle索引机制分析

    - **索引与ROWID**:ROWID是指Oracle为每一行分配的唯一地址。索引可以通过ROWID快速定位到表中的具体行。 - **索引的选择性**:索引的选择性是指索引键值在表中出现的独特程度。如果索引键具有高选择性(例如,护照...

    Oracle技术大牛整理常见问题.pdf

    *.*.*.* Oracle ROWID:ROWID是Oracle中的伪列,指向表中每行的物理位置。Oracle使用ROWID来快速访问表中的数据行。 *.*.*.** 选择性:选择性是指某列中不同值的数目与表中总行数的比例。选择性高的列使用索引的...

    Oracle索引优化

    ROWID是Oracle中唯一标识每一行的地址,它提供了一种直接访问数据行的方式。在处理行级别的操作时,ROWID是非常有用的,例如查找重复值或对ROWID的直接引用。 **限制索引** 索引的使用受限于查询语句的编写方式。...

    Oracle优化经典文章.docx

    Oracle ROWID是每个行的唯一标识,它直接指向数据行的位置。通过ROWID,可以高效地定位和访问单行数据。在处理重复值检查或ROWID相关操作时,ROWID列可以在任何表中使用。 接着,我们讨论了限制索引的情况,这是...

Global site tag (gtag.js) - Google Analytics