我有一张叫做积分的桌子。我执行了以下查询,并期望一个列表的词典排序列表的ROWID,但没有发生。 Order by rowid如何对该行进行排序?
select rowid from points order by rowid
我有像下面这样的行
第二行的词典比第一行小。那么,如果它不是lecxicographical排序,那么排序标准是什么?
答案 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重新分配给新行 稍后插入。