Oracle/SQL中ROWID的数据类型是什么?

11

在Oracle/SQL中,ROWID的数据类型是什么?这个值是如何存储的?


3个回答

10

1
Oracle 11gR2文档:ROWID伪列Rowid数据类型 - user272735
从技术上讲,rowid根本没有被存储,这就是为什么它是一个伪列。 - David Aldridge

2

ROWID数据类型存储与表行在磁盘位置相关的信息。它们还可唯一标识表中的行。ROWID数据类型以十六进制形式存储。

因此,十六进制字符串代表其表中行的唯一地址。


1
一个rowid不需要对应于特定行的唯一标识符。存储在聚簇中的行可以具有相同的rowid,尽管它们具有不同的urowid。有些行根本没有rowid。存储ROWID的位置是十六进制串连接的字符串表示形式,而不是十六进制本身。 - David Aldridge

2

ROWID(自Oracle8称为扩展ROWID,直到Oracle7现在称为受限制的ROWID)存储/编码行的物理位置。

(扩展)ROWID以十六进制格式编码以下字段:OBJID(行所属对象的唯一标识符),FILENO(在创建对象的表空间中的相对文件编号),BLOCKNO(文件内的相对块编号)和ROWNUM(块内相对行号)。

(受限制的)ROWID仅包含FILENO(数据库中的相对文件编号)、BLOCKNO和ROWNUM(与扩展ROWID相同),没有OBJID。

在任何给定时间,ROWID唯一编码数据库中的行(除了共享相同ROWID的聚簇表)。ROWID可能会更改(由于数据库重组),也可能被重新使用(例如,在删除和插入后,新行可能会重用ROWID)。此外,导出/导入表将为表重新分配新的ROWID。

请注意,FILENO在扩展ROWID格式中不一定是每个数据库中唯一的,但由于扩展格式还包含OBJID(唯一标识存储表对象段的表空间),因此我们可以找到唯一的文件。

BLOCKNO在数据库文件中是唯一的,而ROWNUM在数据库块中是唯一的。

例外情况:索引组织表-由于索引重组(叶块的移动),ROWID无法定位到确切的块。

由于数据库重组操作,ROWID可能会更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接