数据库分页
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最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成,显然这个效率要比第一个查询低得多。