经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库运维 » Oracle » 查看文章
MySQL、Oracle和SQL Server的分页查询
来源:cnblogs  作者:zsq_fengchen  时间:2018/11/15 10:19:48  对本文有异议

假设当前是第PageNo页,每页有PageSize条记录,现在分别用Mysql、Oracle和SQL Server分页查询student表。

1、Mysql的分页查询: 

  1. 1 SELECT
  2. 2 *
  3. 3 FROM
  4. 4 student
  5. 5 LIMIT (PageNo - 1) * PageSize,PageSize;

理解:(Limit n,m)  =>从第n行开始取m条记录,n从0开始算。

2、Oracel的分页查询:

  1. 1 SELECT
  2. 2 *
  3. 3 FROM
  4. 4 (
  5. 5 SELECT
  6. 6 S.*, ROWNUM rn
  7. 7 FROM
  8. 8 (SELECT * FROM Student) S
  9. 9 WHERE
  10. 10 Rownum <= pageNo * pageSize
  11. 11 )
  12. 12 WHERE
  13. 13 rn > (pageNo - 1) * pageSize

    或者

  1. 1 SELECT
  2. 2 *
  3. 3 FROM
  4. 4 (
  5. 5 SELECT
  6. 6 S.*, ROWNUM rn
  7. 7 FROM
  8. 8 (SELECT * FROM Student) S
  9. 11 )
  10. 12 WHERE
  11. 13 rn BETWEEN (pageNo - 1) * pageSize AND pageNo * pageSize

理解:假设pageNo = 1,pageSize = 10,先从student表取出行号小于等于10的记录,然后再从这些记录取出rn大于0的记录,从而达到分页目的。ROWNUM从1开始。

分析:对比这两种写法,绝大多数的情况下,第一个查询的效率比第二个高得多。

这是由于CBO 优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。对于第一个查询语句,第二层的查询条件WHERE ROWNUM <=

  1. pageNo * pageSize就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。

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

3、SQL Server分页查询:

  1. 1 SELECT
  2. 2 TOP PageSize *
  3. 3 FROM
  4. 4 (
  5. 5 SELECT
  6. 6 ROW_NUMBER () OVER (ORDER BY id ASC) RowNumber ,*
  7. 7 FROM
  8. 8 student
  9. 9 ) A
  10. 10 WHERE
  11. 11 A.RowNumber > (PageNo - 1) * PageSize

 理解:假设pageNo = 1,pageSize = 10,先按照student表的id升序排序,rownumber作为行号,然后再取出从第1行开始的10条记录。

  分页查询有的数据库可能有几种方式,这里写的可能也不是效率最高的查询方式,但这是我用的最顺手的分页查询,如果有兴趣也可以对其他的分页查询的方式研究一下。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号