【问题标题】:How oracle rowid is generated internally?oracle rowid是如何内部生成的?
【发布时间】:2014-07-27 10:24:14
【问题描述】:

我想知道,oracle中的ROWID是增量生成的吗? 如果我尝试以下查询

select min(ROWID) from table

我总是会得到表中第一个插入行的 ROWID,还是我最终也会得到任何随机行的 ROWID? 如果有人可以在这方面有所帮助,那将非常有帮助

【问题讨论】:

    标签: sql oracle rowid


    【解决方案1】:

    “最小”rowid可能不会始终提供表中插入的第一行。引用the documentation:

    将rowid分配给行块后,rowid可以在特殊情况下更改。例如,如果启用了行移动,则 rowid 可能会因为分区键更新、闪回表操作、收缩表操作等而改变。如果行移动被禁用,那么当使用 Oracle 数据库实用程序导出和导入行时,rowid 可以更改。

    “等等”表示有很多原因会导致rowid发生变化。这可以通过一个小示例轻松演示:

    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 操作之后,唯一的 rowid 已更改。

    如果 rowid 可以更改,并且由于 Oracle 没有明确保证“最低”rowid 始终是第一个插入的行,如果需要,您应该有另一种跟踪方式。时间戳或递​​增序列是正常的。

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      更多详情请前往官网Here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-30
        • 2019-01-17
        • 2016-02-11
        • 1970-01-01
        • 2017-01-12
        相关资源
        最近更新 更多