最近在找oracle的分页存储过程,在google上一搜,基本就是这么两种,都是基于rownum的:1.采用row_number解析函数
SELECT xx.* FROM(
SELECT t.*,row_number() over(ORDER BY id)AS num
FROM t_order t
)xx
WHERE num BETWEEN 5 AND 15;
--返回第5-15行数据2.采用rownum关键字(三层嵌套)
SELECT * FROM(
SELECT A.*,ROWNUM num FROM
(SELECT * FROM t_order ORDER BY id) A
WHERE
ROWNUM<=15)
WHERE num>=5;--返回第5-15行数据
我和经理讨论了一下,发现这两种方法都有着致命的缺点:
a.最内层查询都把所有列先查出来了(t.*、A.*)。若有好几十个列,这样先查出来效率岂不是很低?(虽然早晚都要把需要的列都查出来,但是待会在外层还要再查一次,内层先查等于做了重复的工作!)
b.最内层查询把所有行都查出来了,比如有100w条数据,那先查出来这100w条,然后在外层查询在用rownum分页,这样做效率太低了啊!我的想法是,在最内层查询就用rownum生成一个序号列,再查一个主键ID出来,这样内存查询出来的表temp只有两列(这样是不是效率能高些?)。到了外层查询用表temp的ID和t_order的ID内连查询,再用内层查询生成的ROWNUM分页。
SELECT temp.* FROM (
SELECT t_order.id, row_number() over(ORDER BY id)AS num
FROM t_order
) temp
inner join t_order on temp.id = t_order.id
WHERE num BETWEEN 5 AND 15;请高手赐教
SELECT xx.* FROM(
SELECT t.*,row_number() over(ORDER BY id)AS num
FROM t_order t
)xx
WHERE num BETWEEN 5 AND 15;
--返回第5-15行数据2.采用rownum关键字(三层嵌套)
SELECT * FROM(
SELECT A.*,ROWNUM num FROM
(SELECT * FROM t_order ORDER BY id) A
WHERE
ROWNUM<=15)
WHERE num>=5;--返回第5-15行数据
我和经理讨论了一下,发现这两种方法都有着致命的缺点:
a.最内层查询都把所有列先查出来了(t.*、A.*)。若有好几十个列,这样先查出来效率岂不是很低?(虽然早晚都要把需要的列都查出来,但是待会在外层还要再查一次,内层先查等于做了重复的工作!)
b.最内层查询把所有行都查出来了,比如有100w条数据,那先查出来这100w条,然后在外层查询在用rownum分页,这样做效率太低了啊!我的想法是,在最内层查询就用rownum生成一个序号列,再查一个主键ID出来,这样内存查询出来的表temp只有两列(这样是不是效率能高些?)。到了外层查询用表temp的ID和t_order的ID内连查询,再用内层查询生成的ROWNUM分页。
SELECT temp.* FROM (
SELECT t_order.id, row_number() over(ORDER BY id)AS num
FROM t_order
) temp
inner join t_order on temp.id = t_order.id
WHERE num BETWEEN 5 AND 15;请高手赐教
解决方案 »
- 请问在oracle中有半角与全角字符串转换的内置函数?
- Oracle优化后,数据不更新了.(运行了SYS.DBMS_STATS.GENERATE_STATS)
- 怎么计算oracle共享内存的使用百分比?
- 过程报错????
- 又是对象不存在的问题????
- 求大家帮忙看下怎么才能这个语句,语句运行没错误,但是有没有简单的写法
- 我的JOB停了,奇怪啊
- DYDJ like 'xx' , 如果地dydj有空值,查不出数据,怎么才能排除null这种情况, 不要用 or DYDJ isnull
- PL/SQL中如何使游标返回第一行。
- ORACLE下怎么手动把序列恢复到初始值?----在线等待
- 一个小问题
- 数据库搜索字段问题
推荐用第一种方式来做。
2、使用绑定变量的方式,执行查询语句,这样能够使得oracle重复利用 第一次的sql解析结果,不用重复的解析新的sql语句,可以提高些效率。个人认为,主要就上面这两种方法,如果后来者有什么良策请留言交流。