oracle rowid是如何在内部生成的



我想知道,ROWID在oracle得到增量生成?如果我尝试下面的query

select min(ROWID) from table

我是否总是得到表中第一个插入行的ROWID,或者我最终可能会得到任何随机行的ROWID ?如果有人能解释一下,那就太有帮助了

"最小"行将可能不总是提供从表中插入的第一行。从文档中引用:

在row wid被分配给行片后,row wid可以在特殊情况下改变。例如,如果启用了行移动,那么由于分区键更新、闪回表操作、收缩表操作等原因,row可能会发生变化。如果行移动被禁用,那么如果使用Oracle数据库实用程序导出和导入行,则行id可以更改。

"等等"表示有很多原因会导致队列改变。这可以通过一个小示例轻松演示:

create table tmp_test ( a number );
insert into tmp_test values (1);
select rowid, a from tmp_test;
ROWID                       A
------------------ ----------
AABo3AAFvAAAda6AAA          1
alter table tmp_test move;
select rowid, a from tmp_test;
ROWID                       A
------------------ ----------
AABo3BAFvAAAdbjAAA          1

您会注意到,在alter table操作之后,唯一的行已经改变了。

如果行号可以改变,并且Oracle没有明确保证"最低"行号总是第一个插入的行,如果需要,你应该有另一种方法来跟踪它。时间戳或递增序列是正常的。

在不引用任何数据的情况下找到第一个插入的行,这一定是一个非常不寻常的要求。如果你正在考虑使用,我会再看看为什么你需要这样做。

min(ROWID)将始终返回表的第一行。

对于数据库中的每一行,ROWID伪列返回行地址。Oracle数据库的行值包含信息必须定位一行:

  1. 对象的数据对象号
  2. 行所在数据文件中的数据块
  3. 数据块中行(第一行为0)的位置
  4. 行所在的数据文件(第一个文件为1),文件号相对于表空间。

通常,行值唯一地标识数据库中的一行。但是,不同表中的行可以存储在同一个表中集群可以有相同的行id

>

最新更新