您的位置:首页 > 数据库

sql优化__rownum的使用

2016-08-17 22:12 106 查看
ROWNUM的概念

ROWNUM是一个虚假的列。它将被分配为 1,2,3,4,…N,N 是行的数量。一个ROWNUM值不是被永久的分配给一行 (这是最容易被误解的)。表中的某一行并没有标号;你不可以查询ROWNUM值为5的行——根本没有这个概念。另一个容易搞糊涂的问题是ROWNUM值是何时被分配的。ROWNUM值的分配是在查询的谓词解析之后,任何排序和聚合之前进行的。ROWNUM值只有当被分配之后才会增长。这就是为什么下面的查询永远都不会返回结果:

select * from countries where rownum>1;

ROWNUM > 1对于第一行来说并不是真值,ROWNUM没有增长到 2。所以,没有比1大的ROWNUM.永远都不要使用’ROWNUM>?‘和’ROWNUM=2…N’这样的条件。

用rownum显示排序结果的前N条记录

FROM/WHERE子句先被执行.

根据FROM/WHERE子句输出的行, ROWNUM被分配给他们并自增长.

SELECT 被应用.

GROUP BY 被应用.

HAVING is 被应用.

ORDER BY 被应用.

这就是为什么下面的SQL几乎总是错误的:

select rownum,job_title,min_salary

from jobs where rownum<3 order by min_salary;

正确的写法:

select rownum,tmp.* from (

select job_title,min_salary

from jobs order by min_salary) tmp

where rownum<=3;

用ROWNUM实现分页

select * from

(select /+ FIRST_ROWS(n) / a.*,

ROWNUM rnum

from (your_query_goes_here, with order by) a

where ROWNUM <=

:MAX_ROW_TO_FETCH )

where rnum >= :MIN_ROW_TO_FETCH;

FIRST_ROWS(N)使优化器考虑最短时间获得前N条记录.

:MAX_ROW_TO_FETCH 某一页中结果集的最后一行。如果你每页显示10行,要显示第6页,那么此值取60。

:MIN_ROW_TO_FETCH 某一页中结果集的第一行。如果你每页显示10行,要显示第6页,那么此值取50。

ROWNUM对性能的影响

ROWNUM可以避免oracle在磁盘上进行排序。rownum无法避免全表扫描的发生,但是它可以避免对整个表数据的排序操作,在指定了rownum后,排序操作在内存中可以轻松完成。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sql 优化