数据库分页

MySql分页

--page:当前页   pageNum:每页显示条数   
select  * from goods e  limit 2,2;
select * from  goods e limit (page-1)*pageNum,pageNum;--MySql分页公式,按照公式来,取值前开后闭:<   <=    第一个参数:从第几条开始取,第二个参数:取几条

Oracle分页  

1. 第一种

--公式
--page:当前页   pageNum:每页显示条数  
select *
  from (select stu.*, rownum rn
          from (select * from stu) stu
         where rownum <= (page-1)*pageNum+pageNum)
 where rn > (page-1)*pageNum; 

--具体例子
select *
  from (select stu.*, rownum rn
          from (select * from stu) stu
         where rownum <= 3)
 where rn >= 1;

2.第二种

--公式
--page:当前页   pageNum:每页显示条数  
 select *
   from (select stu.*, rownum rn from (select * from stu) stu)
  where rn > (page - 1) * pageNum
    and rn <= (page - 1) * pageNum + pageNum); --网上这里用Between闭区间,我觉得不合适这个公式,这个公式要前开后闭

--具体例子
select *
  from (select stu.*, rownum rn from (select * from stu) stu)
 where rn <= 3
   and rn > 0;  

对比这两种写法,绝大多数的情况下,第一种oracle分页的效率比第二种高得多。对于Oracle推荐第一种

这是由于CBO 优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。对于第一个查询语句,第二层的查询条件WHERE ROWNUM <= 3就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。而第二个查询语句,由于查询条件rn <= 3 and rn > 0

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

  

posted @ 2020-04-15 21:51  小胡666  阅读(132)  评论(0编辑  收藏  举报
39
0