Rownum导致结果以无序方式显示结果

时间:2014-01-29 13:23:17

标签: mysql sql oracle oracle-sqldeveloper

我的查询结尾有rownum >=15 当我运行此查询时,这会正确显示结果,这意味着它会逐个显示所有15行,并且所显示的行的顺序不会更改。结果的示例顺序如下:1,2,3,
但是,当我从查询中删除rownum >=15时,结果不会按顺序1,2,3显示,而是按顺序显示结果1,3,2。
你们的任何想法都对我解决这个问题非常有帮助。

1 个答案:

答案 0 :(得分:1)

这是许多人持久的追问。

此类行为的原因可以分析如下。

您的数据库必须处于串行模式

Oracle文档说:

  

Oracle数据库以两种方式之一将数据插入表中:

     
      
  • 串行模式:在常规INSERT 操作期间,数据库重用表中的可用空间,将新插入的数据与现有数据交错。

  •   
  • 并行模式:在直接路径INSERT 操作期间,数据库将插入的数据追加到表中的现有数据之后。不重用现有数据中的可用空间,并忽略参照完整性约束。这些程序相结合可以提高绩效。

  •   

在传统模式下,以下记录

insert into users
  values( 1, 'Elvis' ), ( 2, 'Jackson' ), ( 3, 'Madonna' );

可能导致以下存储顺序 因此,基本选择会产生相同的效果。

2   Jackson
1   Elvis
3   Madonna

direct-path INSERT 中,数据将附加到表的末尾,而不是使用当前分配给表的现有空间。

要强制使用直接路径INSERT ,我们使用/*+ APPEND */提示。

insert /*+ APPEND */ into users
  values( 1, 'Elvis' ), ( 2, 'Jackson' ), ( 3, 'Madonna' );

追加表格末尾的行 因此,基本选择将按插入顺序获取记录

1   Elvis
2   Jackson
3   Madonna

但是在选择直接路径模式之前添加的那些记录会发生什么?插入时它们存在于相同的位置。要解决此类问题,我们必须使用以下 order by 选项中的任何一个:

  • RowID - 插入行的地址ID。 (我的观察是每个表总是顺序的)。使用order by rowid
  • 已编入索引字段 - 例如order by user_id
  • INDEX hint - 在适当的字段上定义索引,并使用此提示按照为索引定义的顺序获取记录。

在您的数据上,没有选项,只能选择合适的订购解决方案并进行检索。