逐行ID如何在Oracle中运行?

时间:2016-01-12 11:39:56

标签: sql oracle rowid

我有一张叫做积分的桌子。我执行了以下查询,并期望一个列表的词典排序列表的ROWID,但没有发生。 Order by rowid如何对该行进行排序?

select rowid from points order by rowid

我有像下面这样的行

  1. AAAE6MAAFAAABiSAAA
  2. AAAE6MAAFAAABi + AAA
  3. 第二行的词典比第一行小。那么,如果它不是lecxicographical排序,那么排序标准是什么?

2 个答案:

答案 0 :(得分:9)

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

实际的rowid包含有关数据块的二进制信息,块中的行,块所在的文件以及表的内部对象id(See the manual for details

当您使用order by rowid时,Oracle会根据该(内部)信息对行进行排序,而不是基于"字符串表示"。

如果您将查询更改为:

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

你很可能会看到rownumber排序背后的逻辑。

请注意dbms_rowid.rowid_object()的值始终相同。如果你的表中只有两行,那么rowid_block_number()

的两行最有可能相同

答案 1 :(得分:1)

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

  

如果删除一行,则Oracle可能会将其rowid重新分配给新行   稍后插入。