在 Oracle 中如何按行 ID 排序?

How does order by row id work in Oracle?

我有一个table叫积分。我执行了以下查询,并期望得到一个按字典顺序排序的 ROWID 列表列表,但这并没有发生。 Order by rowid 如何对行进行排序?

select rowid from points order by rowid

我有如下几行

  1. AAAE6MAAFAAAABiSAAA
  2. AAAE6MAAFAAABi+AAA

第二行在字典序上比第一行小。那么如果不是词典排序,排序标准是什么?

rowid的顺序不保证。这取决于您如何设置 NLS 设置。 rowid 也表示数据库中行的物理分配。 rowid 被认为是不可变的(不会改变)但是如果你删除一行并再次插入它然后它会改变。

If you delete a row, then Oracle may reassign its rowid to a new row inserted later.

为什么你看到的只是用于显示目的的表示。

实际的rowid包含数据块的二进制信息,块中的行,块所在的文件和table(See the manual for details)

当您使用 order by rowid 时,Oracle 根据该(内部)信息而不是 "string representation" 对行进行排序。

如果您将查询更改为:

select rowid, 
       dbms_rowid.rowid_relative_fno(rowid) as rel_fno,
       dbms_rowid.rowid_row_number(rowid) as row_num,
       dbms_rowid.rowid_block_number(rowid) as block_num, 
       dbms_rowid.rowid_object(rowid)
from points 
order by rowid

您很可能会看到行号排序背后的逻辑。

请注意,dbms_rowid.rowid_object() 的值将始终相同。如果您的 table 中只有两行,那么这两行很可能也具有相同的 rowid_block_number()