sql优化__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后,排序操作在内存中可以轻松完成。
sql优化__rownum的使用【转】的更多相关文章
- SQL优化案例—— RowNumber分页
		将业务语句翻译成SQL语句不仅是一门技术,还是一门艺术. 下面拿我们程序开发工程师最常用的ROW_NUMBER()分页作为一个典型案例来说明. 先来看看我们最常见的分页的样子: WITH CTE AS ... 
- sql 优化
		1.选择最有效率的表名顺序(只在基于规则的优化器中有效): oracle的解析器按照从右到左的顺序处理 from 子句中的表名,from子句中写在最后的表(基础表driving table)将被最先处 ... 
- SQL 优化总结
		SQL 优化总结 (一)SQL Server 关键的内置表.视图 1. sysobjects SELECT name as '函数名称',xtype as XType FROM s ... 
- (转)SQL 优化原则
		一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用 系统提交实际应用后,随着数据库中数据的增加,系 ... 
- sql优化阶段性总结以及反思
		Sql优化思路阶段性心得: 这段时间的优化做了好几个案例,其实有很多的类似点,都是好几张大表的相互连接,然后执行长达好几个小时,甚至都跑不出来. 自己差不多的思路就是Parallel full tab ... 
- mysql sql优化实例
		mysql sql优化实例 优化前: pt-query-degist分析结果: # Query 3: 0.00 QPS, 0.00x concurrency, ID 0xDC6E62FA021C85B ... 
- SQL优化技巧
		我们开发的大部分软件,其基本业务流程都是:采集数据→将数据存储到数据库中→根据业务需求查询相应数据→对数据进行处理→传给前台展示.对整个流程进行分析,可以发现软件大部分的操作时间消耗都花在了数据库相关 ... 
- ORACLE常用SQL优化hint语句
		在SQL语句优化过程中,我们经常会用到hint,现总结一下在SQL优化过程中常见Oracle HINT的用法: 1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳吞吐量, ... 
- SQL优化有偿服务
		本人目前经营MySQL数据库的SQL优化服务,100块钱一条.具体操作模式 其中第一条,可以通过在微信朋友圈转发链接中的信息(http://www.yougemysqldba.com/discuz/v ... 
随机推荐
- tomcat 启动超时
			1.如果是eclipse 里集成的tomcat 在server 下 双击tomcat 在tomcat 配置里将启动时间延长,保存再启动. 2.如果是非集成的tomcat 则在tomcat的配置文件 ... 
- 自定义MVC框架(二) -基于XML文件
			1.oracle的脚本 create table STUDENT ( sid NUMBER primary key, sname ), age NUMBER, pwd ) ) create seque ... 
- HDU 1240 Asteroids!(BFS)
			题目链接 Problem Description You're in space.You want to get home.There are asteroids.You don't want to ... 
- 2014web面试题
			面试题目会根据你的等级和职位变化,入门级到专家级:范围↑.深度↑.方向↑; 类型: 技术视野.项目细节.理论知识型题,算法题,开放性题,案例题. 进行追问,可以确保问到你开始不懂或者面试官开始不懂为止 ... 
- 创建透明CEdit控件
			1.在资源编辑器中将Edit控件的Border设为none(当然也可以在代码中修改窗口样式) 2.在重载CEdit的类中响应MSG_OCM_CTLCOLOREDIT消息,在处理函数中将背景模式设为透明 ... 
- rabbitmq——镜像队列
			转自:http://my.oschina.net/hncscwc/blog/186350?p=1 1. 镜像队列的设置 镜像队列的配置通过添加policy完成,policy添加的命令为: rabbit ... 
- 【python问题系列--3】TypeError: 'builtin_function_or_method' object has no attribute '__getitem__'
			p0V,p1V,pSpam=trainNBO(array[trainMat],array(trainClasses)) 改为: p0V,p1V,pSpam=trainNBO(array(trainMa ... 
- CentOS 7 安装Python pip
			1 首先安装epel扩展源: sudo yum -y install epel-release 2 然后安装python-pip sudo yum -y install python-pip 3安装完 ... 
- 简析TCP的三次握手与四次分手【转】
			转自 简析TCP的三次握手与四次分手 | 果冻想http://www.jellythink.com/archives/705 TCP是什么? 具体的关于TCP是什么,我不打算详细的说了:当你看到这篇文 ... 
- FreeMarker 小结
			一.Sequence 的内置函数1.sequence?first 返回sequence 的第一个值.2.sequence?last 返回sequence 的最后一个值.3.sequence?rever ... 
