sql优化__rownum的使用【转】
2016-08-17 22:14
141 查看
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后,排序操作在内存中可以轻松完成。
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后,排序操作在内存中可以轻松完成。
相关文章推荐
- 优化使用ROWNUM进行分页查询的SQL
- sql优化__rownum的使用
- ASP.NET优化连载(三)只读数据访问用SqlDataReader,不要使用DataSet
- SQL优化-索引 (二)结合实际,谈索引使用的误区
- 如何进行SQL性能优化——使用Data Collector
- 使用with as 优化SQL
- [MySQL优化] -- 如何使用SQL Profiler 性能分析器
- 优化PL/SQL过程调用,使用NOCOPY提示
- 使用查询计划优化查询(SQL SERVER)
- [MySQL优化] -- 如何使用SQL Profiler 性能分析器
- SQL优化--使用 EXISTS 代替 IN 和 inner join来选择正确的执行计划
- PL/SQL性能优化工具profiler的部署和使用
- SQL优化-索引 (四)其他书上没有的索引使用经验总结
- SQL优化--使用内连接(inner join)代替外连接(left join,right join) (转)
- SQL优化--使用关联查询代替子查询
- [Oracle]高效的PL/SQL程序设计(一)--伪列ROWNUM使用技巧
- [Oracle]高效的PL/SQL程序设计(一)--伪列ROWNUM使用技巧
- SQL优化--使用 EXISTS 代替 IN 和 inner join来选择正确的执行计划
- SQL优化--使用 EXISTS 代替 IN 和 关联查询(inner join) (转载)http://www.cnblogs.com/zping/archive/2008/08/05/1260959.html
- 【求助】使用SQL语句优化工具遇到的问题