0

如果我说:

select * from table order by col1 where rownum < 100

如果表有 1000 万条记录,Oracle 会带上所有 1000 万条记录,排序然后显示前 10 条吗?或者有没有办法优化它?

4

1 回答 1

3

如果你这样做

select * from table order by col1 where rownum < 100

然后 Oracle 将抛出错误,因为 WHERE 子句位于 ORDER BY 之前。

如果你这样做

select * from table where rownum < 100 order by col1 

然后 Oracle 将返回随机的 99 条记录,因为 WHERE 子句位于 ORDER BY 之前。

如果要返回按列排序的前 100 条记录,则必须将 order by 放在子选择中。

select * 
  from ( select * from table order by col1 )
 where rownum <= 100

Oracle 会进行排序,否则它如何知道您想要的记录?但是,由于 ROWNUM,它将是一个带有停止键的排序。Oracle实际上并没有对整个结果集进行排序,因为在后台进行了一些优化,但这是您可以假设发生的事情。

请参阅Tom Kyte 的这篇文章

于 2013-07-04T19:44:51.150 回答