如果我说:
select * from table order by col1 where rownum < 100
如果表有 1000 万条记录,Oracle 会带上所有 1000 万条记录,排序然后显示前 10 条吗?或者有没有办法优化它?
如果我说:
select * from table order by col1 where rownum < 100
如果表有 1000 万条记录,Oracle 会带上所有 1000 万条记录,排序然后显示前 10 条吗?或者有没有办法优化它?
如果你这样做
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 的这篇文章。