Sql rownum在Oracle中的行为

Sql rownum在Oracle中的行为,sql,oracle,oracle11g,sql-order-by,rownum,Sql,Oracle,Oracle11g,Sql Order By,Rownum,我在Oracle的静态表中观察到ROWNUM有一种奇怪的行为。我正在尝试使用如下查询分页 select * from ( select the_data,rownum as seqn from the_table ) where seqn <= somenumber and seqn >= othernumber 但是,当我多次执行查询时,我观察到返回的rownum值对于一行来说不是唯一的,即如果一行第一次出现在rownum 25,那么第二次执行时它就会出现在r

我在Oracle的静态表中观察到ROWNUM有一种奇怪的行为。我正在尝试使用如下查询分页

select * from (
     select the_data,rownum as seqn from the_table  
  )  where seqn <= somenumber and seqn >= othernumber
但是,当我多次执行查询时,我观察到返回的rownum值对于一行来说不是唯一的,即如果一行第一次出现在rownum 25,那么第二次执行时它就会出现在rownum 125

如果我通过like下订单,则不会出现此问题

select * from (
     select the_data,rownum as seqn from the_table order by column3 
  )  where seqn <= somenumber and seqn >= othernumber

但是,按顺序排序会降低性能。这是正常的还是有其他方法可以提高性能。

您应该查看oracle文档以了解此问题。以下链接可能对您有所帮助


T是一个表名。R是一行

这是常见问题解答。你将在我标记为重复的问题中得到你的答案。在第一个查询中,子查询中没有ORDER BY,因此无法保证获取的行的顺序。@Lalit Kumar B但对于静态表,rownum应该在每次启动queryNO时都不相同,决不。ROWNUM是一个伪列,在通过谓词阶段后分配给行。行不会以任何顺序存储,也不会以任何顺序获取。为了确保顺序,必须始终指定order BY。@Lalit Kumar B但order BY会降低性能。如果不使用order,还有其他方法吗?因为显式排序总是有开销的。在12c上,您可以使用新的Top-n Now limiting功能,但是,对行进行排序的额外成本将始终存在。要将查询返回的行数限制在表T的前10行,请使用以下查询:SELECT*from SELECT ROW\ U number OVER AS R,T.*来自T AS TR,其中R@Khamill,但当多次执行查询且查询中不需要order by时,该值是否保持不变
One example: 
SELECT * FROM ( SELECT ROW_NUMBER() OVER () AS R, T.* FROM T ) AS TR WHERE R <= 10;