【发布时间】:2013-07-05 03:49:56
【问题描述】:
如果我说:
select * from table order by col1 where rownum < 100
如果表有 1000 万条记录,Oracle 会带上所有 1000 万条记录,排序然后显示前 10 条吗?还是有办法优化它?
【问题讨论】:
标签: sql oracle optimization
如果我说:
select * from table order by col1 where rownum < 100
如果表有 1000 万条记录,Oracle 会带上所有 1000 万条记录,排序然后显示前 10 条吗?还是有办法优化它?
【问题讨论】:
标签: sql oracle optimization
如果你这样做
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 条记录,您必须将排序依据放在子选择中。
select *
from ( select * from table order by col1 )
where rownum <= 100
Oracle 会进行排序,否则它如何知道您想要的记录?但是,由于 ROWNUM,它将是一个带有停止键的排序。 Oracle 并没有实际上对整个结果集进行排序,因为在后台进行了一些优化,但这是您可以假设的情况。
【讨论】: