`
子衿青青
  • 浏览: 110843 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

oracle的rowid

 
阅读更多

Oracle 的 rowid 回顾

 

以下内容来自网上的搜集后整理的内容,仅供个人回顾参考之用。

1、rowid 感官认识

rowid 为该表行的唯一标识,是一个伪列,不存储在数据库中,不是数据库数据。我们可以用在SELECT中,但不可以用INSERT, UPDATE, DELETE来操作该值。rowid 列,Oracle 使用 rowid 列来建立内部索引。
再次强调一次,rowid 伪列不存储在数据库中,它不是数据库数据。这是从database及table的逻辑结构来说的,事实上在物理结构上,每行由一个或多个 row pieces 组成,每个 row piece 的头部包含了这个 piece 的 address, 即 rowid. 从这个意义上来说,rowid 还是占了磁盘空间的。

 

Oracle 中的 rowid 是数据的物理地址。一个 rowid 包含关于文件、块和该块中的行的一行信息。 rowid 还包含其它数据,如相关文件数和 OBJECT_ID.

rowid 可以分为物理 rowid 和逻辑 rowid 两种。普通的堆表中的 rowid 是物理 rowid ,索引组织表(IOT)的 rowid 是逻辑 rowid . Oracle 提供了一种 urowid 的数据类型,同时支持物理和逻辑 rowid。

物理 rowid 又分为扩展 rowid(extended rowid) 和限制 rowid(restricted rowid) 两种格式。限制 rowid 主要是 oracle7 以前的 rowid 格式,现在已经不再使用,保留该类型只是为了兼容性。 Oracle 从 8i 开始引进 Object 的概念后的 rowid,即扩展(extended)的 rowid.

UROWID(可以称为通用ROWID,逻辑ROWID): 表的行地址,表指的是index-organized tables。

我们从 rowid 伪列里 select 出来的 rowid 是基于 base64 编码,一共有 18 位,分为 4 部分:OOOOOOFFFBBBBBBRRR.
其中:
OOOOOO:六位表示 data object id,根据 object id 可以确定 segment. 关于 data object id 和 object id 的区别,请参考http://www.orawh.com/index.php/archives/62
FFF:三位表示相对文件号。根据该相对文件号可以得到绝对文件号,从而确定 datafile. 关于相对文件号和绝对文件号,请参考http://blog.itpub.net/post/330/22749
BBBBBB:六位表示 data block number. 这里的 data block number 是相对于 datafile 的编号,而不是相对于 tablespace 的编号。
RRR:三位表示row number.

例子一:
SQL> select ROWID from Bruce_test where rownum<2;

ROWID
------------------ ----------
AAABnlAAFAAAAAPAAA
ROWID的格式如下:

数据对象编号 文件编号 块编号 行编号
OOOOOO FFF BBBBBB RRR

我们可以看出,从上面的rowid可以得知:
AAABnl 是数据对象编号
AAF是相关文件编号
AAAAAP是块编号
AAA 是行编号

 

例子二:

SQL> create table test(id int,name varchar2(30));
Table created.
SQL> insert into test values(1,'a');
1 row created.
SQL> commit;
Commit complete.
SQL> select rowid from test;
ROWID
------------------
AAAGbEAAHAAAAB8AAA

SQL> select dbms_rowid.rowid_object(rowid) obj#,
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 dbms_rowid.rowid_to_absolute_fno(rowid,'SYS','TEST') file#
6 from test;

OBJ# RFILE# BLOCK# ROW# FILE#
----------- ------------ ------------- ---------- ----------
26308 7 124 0 7
(一般如果不使用这些具体值的话,可以不用特意去计算这些值。如果想要计算,可以参考http://www.2cto.com/database/201109/104961.html 文章的介绍)

 

2、一些有用的sql语句

2.1、基于rowid的显示方式得到的响应的64位编码对应值的sql

select rowid ,
substr(rowid,1,6) "OBJECT",
substr(rowid,7,3) "FILE",
substr(rowid,10,6) "BLOCK",
substr(rowid,16,3) "ROW"
from TableName;

OWID OBJECT FILE BLOCK ROW
------------------ ------------ ------ ------------ ------
AAABc4AADAAAGLUAAA AAABc4 AAD AAAGLU AAA
AAABc4AADAAAGLUAAB AAABc4 AAD AAAGLU AAB
AAABc4AADAAAGLUAAC AAABc4 AAD AAAGLU AAC
AAABc4AADAAAGLUAAD AAABc4 AAD AAAGLU AAD
AAABc4AADAAAGLUAAE AAABc4 AAD AAAGLU AAE

 

2.2、通过dbms_rowid这个包,可以直接的得到具体的rowid包含的信息

select dbms_rowid.rowid_object(rowid) object_id, dbms_rowid.rowid_relative_fno(rowid) file_id,
dbms_rowid.rowid_block_number(rowid) block_id ,dbms_rowid.rowid_row_number(rowid) num from bruce_t where rownum<5;

OBJECT_ID FILE_ID BLOCK_ID NUM
---------- ---------- ---------- ----------
5944 3 25300 0
5944 3 25300 1
5944 3 25300 2
5944 3 25300 3

一些使用ROWID的函数
ROWIDTOCHAR(rowid) :将ROWID转换成STRING
CHARTOROWID('rowid_string') :将STRING转换成ROWID

 

2.3、一个网友写的较实用的小函数

create or replace function get_rowid

(l_rowid in varchar2)
return varchar2
is
ls_my_rowid varchar2(200);
rowid_type number;
object_number number;
relative_fno number;
block_number number;
row_number number;

begin
dbms_rowid.rowid_info(l_rowid,rowid_type,object_number,relative_fno, block_number, row_number);
ls_my_rowid := 'Object# is :'||to_char(object_number)||chr(10)||
'Relative_fno is :'||to_char(relative_fno)||chr(10)||
'Block number is :'||to_char(block_number)||chr(10)||
'Row number is :'||to_char(row_number);
return ls_my_rowid ;
end;

/

 

使用:

SQL> select get_rowid(rowid), name from bruce_t;
GET_ROWID(ROWID) NAME

-------------------------------------------------------------------------------- --------------------------------
Object# is :5944 BruceLau
Relative_fno is :3
Block number is :25300
Row number is :0
Object# is :5944 MabelTang
Relative_fno is :3
Block number is :25300
Row number is :1

 

 

分享到:
评论

相关推荐

    基于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 学习手册》

    此外,还有对ORACLE ROWID、选择性、群集因子、二元高度等高级索引特性的讨论。 文档还提供了作者的联系方式和社交网络账号,便于读者反馈问题和进行交流。同时,手册作者也表达了对内容更新的计划,并承诺将在未来...

    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技术大牛整理常见问题.pdf

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

    Oracle索引优化

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

Global site tag (gtag.js) - Google Analytics