`

Oracle排序后分页查询与效率问题

阅读更多

 

原始未分页查询Sql代码如下:

 

select ROWNUM rn, t.id ID, o.name YYB,u.name XM, t.MC from tZDYSX   
t,tuser u,lborganization o where t.cjr=u.id and u.orgid=o.orgcode and t.gx = 1   
order by ID  
 

结果如下:
RN    ID      YYB       XM     MC
---------- ----------------- ----------------------
3     49  某证券总部     管理员 测试
4     96  某证券总部     管理员 持有上港10000股以上
5    102 某证券总部     管理员 十年规划
14   105 某证券总部     管理员 开发渠道为上海
11   106 某证券总部     管理员 万科A
12   107 某证券总部     管理员 11
13   108 某证券总部     管理员 今天过生日的客户
2    109 某证券总部     管理员 客户状态正常
6    110 某证券总部     管理员 无交易
7    111 某证券总部     管理员 OA
8    112 某证券总部     管理员 幸运客户
9    113 某证券总部     管理员 风险型
10   114 某证券总部     管理员 tst
22   115 白沙网上交易   安昌彪 安客户正常
1    118 某证券总部     管理员 213
18   119 某证券总部     管理员 客户号包含1008
17   120 某证券总部     管理员 aaa
19   123 某证券总部     管理员 ssssssss
20   124 某证券总部     管理员 www
21   126 某证券总部     管理员 123123
15   127 某证券总部     管理员 1212
16   128 某证券总部     管理员 aaaaaa

22 rows selected

 

最初我使用如下Sql代码查询:

select * from (select ROWNUM rn, t.id ID, o.name YYB,u.name XM, t.MC    
from tZDYSX t,tuser u,lborganization o where t.cjr=u.id and u.orgid=o.orgcode and    
t.gx = 1 order by t.ID )Where rn>10 and rn<=20;  

 

这种方法能成功分页,结果如下:
RN    ID        YYB       XM      MC
---------- ----------------- -------------------
14   105 某证券总部     管理员 开发渠道为上海
11   106 某证券总部     管理员 万科A
12   107 某证券总部     管理员 11
13   108 某证券总部     管理员 今天过生日的客户
18   119 某证券总部     管理员 客户号包含1008
17   120 某证券总部     管理员 aaa
19   123 某证券总部     管理员 ssssssss
20   124 某证券总部     管理员 www
15   127 某证券总部     管理员 1212
16   128 某证券总部     管理员 aaaaaa

10 rows selected

 

从结果看来,有个问题:此语句Sql代码
order by CJSJ DESC  被执行,但是是在分后的第11到20条记录的结果集中再进行排序,而不是先排序后分页。(本来希望显示ID为112到126,结果变为105到128)

 

后来变为以下Sql代码查询: 

 

SELECT *    
FROM(    
SELECT ROWNUM RN,TA.*    
FROM(   
select t.id ID, o.name YYB,u.name XM, t.MC   
from tZDYSX t,tuser u,lborganization o    
where t.cjr=u.id and u.orgid=o.orgcode and t.gx = 1 order by t.ID   
)TA WHERE ROWNUM <= 20   
)WHERE RN > 10  

 

结果如下:
RN    ID     YYB           XM     MC
---------- ----------------- -------------------
11   112 某证券总部     管理员 幸运客户
12   113 某证券总部     管理员 风险型
13   114 某证券总部     管理员 tst
14   115 白沙网上交易   安昌彪 安客户正常
15   118 某证券总部     管理员 213
16   119 某证券总部     管理员 客户号包含1008
17   120 某证券总部     管理员 aaa
18   123 某证券总部     管理员 ssssssss
19   124 某证券总部     管理员 www
20   126 某证券总部     管理员 123123

10 rows selected

 

看来结果是正确的。

总结:第二种方法其中最内层的查询Sql代码

select t.id ID, o.name YYB,u.name XM, t.MC   
from tZDYSX t,tuser u,lborganization o    
where t.cjr=u.id and u.orgid=o.orgcode and t.gx = 1 order by t.ID 

 

表示不进行翻页的原始查询语句。ROWNUM <= 20和RN > 10控制分页查询的每页的范围。
第二种方法在大多数情况拥有较高的效率。分页的目的就是控制输出结果集大小,在上面的分页查询语句中,这种考虑主要体现在WHERE ROWNUM <= 20这句上。

 

选择第11到20条记录存在两种方法,第二种方法正是在查询的第二层通过ROWNUM <= 20来控制最大值,在查询的最外层控制最小值。而第一种方法是去掉查询第二层的WHERE ROWNUM <= 20语句,在查询的最外层控制分页的最小值和最大值。

 

一般来说,第二个查询的效率比第一个高得多,这是由于CBO 优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。对于第二个查询语句,第2层的查询条件WHERE ROWNUM <= 20就可以被Oracle推入到内层查询中,这Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。

 

而第一个查询语句,由于查询条件Where rn>10 and rn<=20是存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层(即使推到最内层也没有意义,因为最内层查询不知道RN代表什 么)。因此,对于第一个查询语句,Oracle最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。数据的过滤在最外层完 成,显然这个效率要比第二个查询低得多。

 

这种分页对于单表查询、多表查询一样有效。

 

原文地址: http://database.51cto.com/art/200903/112950.htm

分享到:
评论

相关推荐

    解决Oracle分页查询中排序与效率问题

    解决Oracle分页查询中排序与效率问题解决Oracle分页查询中排序与效率问题解决Oracle分页查询中排序与效率问题解决Oracle分页查询中排序与效率问题

    如何解决Oracle分页查询中排序与效率问题

    本文将结合作者近日工作中,在ORACLE数据库分页查询时,遇到一个小问题,为大家讲解如何解决Oracle分页查询中排序与效率问题。

    Oracle实现分页查询的SQL语法汇总

    本文实例汇总了Oracle实现分页查询的SQL语法,整理给大家供大家参考之用,详情如下: 1.无ORDER BY排序的写法。(效率最高) 经过测试,此方法成本最低,只嵌套一层,速度最快!即使查询的数据量再大,也几乎不受影响...

    ORACLE9i_优化设计与系统调整

    §7.3 Oracle系统安装后的优化基础工作 94 §7.3.1 Oracle系统有关目录所有文件的保护 94 §7.3.2 避免新用户使用默认system系统表空间 94 §7.4 Oracle系统所在服务器的独立性 94 第9章 项目分析、设计与管理 94 §...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    varchar2 1~4000字节 可变长度字符串,与CHAR类型相比,使用VARCHAR2可以节省磁盘空间,但查询效率没有char类型高 数值类型 Number(m,n) m(1~38) n(-84~127) 可以存储正数、负数、零、定点数和精度为38位的浮点数...

    Oracle事例

    14、查询从多少行到多少行的记录(可以用在web开发中的分页显示) select * from ( select rownum row_id,b.* from (select a.* from sys_oper a) b ) where row_id between 15 and 20 15、对公共授予访问权 ...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例271 清理SESSION缓存提高网站访问的效率 358 第6章 图形图像处理 361 6.1 图像与统计 362 实例272 图形计数器 362 实例273 GD2图形计数器 363 实例274 通过图像显示投票统计结果 365 实例275 通过图像显示密码...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例271 清理SESSION缓存提高网站访问的效率 358 第6章 图形图像处理 361 6.1 图像与统计 362 实例272 图形计数器 362 实例273 GD2图形计数器 363 实例274 通过图像显示投票统计结果 365 实例275 通过图像显示密码...

    asp.net知识库

    分页存储过程:排序反转分页法 优化后的通用分页存储过程 sql语句 一些Select检索高级用法 SQL server 2005中新增的排序函数及应用 根据基本表结构及其数据生成 INSERT ... 的 SQL 简便的MS SQL 数据库 表内容 脚本 ...

    AppFramework_V1.0_New

    &lt;br&gt;3、 增加ObjectTable泛型类来承载查询返回的对象集,不但比IList更加强类型化,还提供了二分查找功能,使得对象结果集可以在应用程序内存中进行重排序和快速查找; &lt;br&gt;4、 提供了强大的QueryFilter类...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    3.3 数组排序与查询 61 实例050 使用选择排序法 61 实例051 使用冒泡排序法 62 实例052 使用快速排序法 64 实例053 使用直接插入法 65 实例054 使用sort方法对数组进行排序 67 实例055 反转数组中元素的顺序 68 3.4 ...

    AppFramework_V1.0

    &lt;br&gt;3、 增加ObjectTable泛型类来承载查询返回的对象集,不但比IList更加强类型化,还提供了二分查找功能,使得对象结果集可以在应用程序内存中进行重排序和快速查找; &lt;br&gt;4、 提供了强大的QueryFilter类...

    AppFramework数据库访问组件_代码生成插件_V1.1.rar

    &lt;br&gt;3、 增加ObjectTable泛型类来承载查询返回的对象集,不但比IList更加强类型化,还提供了二分查找功能,使得对象结果集可以在应用程序内存中进行重排序和快速查找; &lt;br&gt;4、 提供了强大的QueryFilter类...

    SQL培训第一期

    union 会对查询数据进行去重并排序,union all只是简单的将两个结果合并。 1.8.8 wm_concat 1.8.8.1 语法 select wm_concat(t.role_name) from g_role t where t.role_name like '%书记%' 1.8.8.2 说明 拼接字符串,...

    收获不止SQL优化

    12.2.3 所在环境的资源不足等问题 351 12.3 本章习题、总结与延伸 351 第13章 动手,过程函数优化让SQL飞 352 13.1 PL/SQL优化重点 353 13.1.1 定义类型的优化 353 13.1.2 PL/SQL的集合优化 355 13.1.3 PL/...

    精髓Oralcle讲课笔记

    -- 首先,以超级管理员的身份登录oracle sqlplus sys/bjsxt as sysdba --然后,解除对scott用户的锁 alter user scott account unlock; --那么这个用户名就能使用了。 --(默认全局数据库名orcl) 1、...

    JAVA面试题最全集

    5.Java中的分页、效率考虑。 6.简单介绍您所了解的structs。 1.xml在项目中的作用 2.s-EJB 与 e-EJB的区别 3.会话面的作用 4.cmp与bmp的优缺点 5.j2me程序的必需的几个部分 6.c/s与b/s的区别 7.构建一...

Global site tag (gtag.js) - Google Analytics