oracle 使用rownum进行分页的陷阱

本文详细介绍了在Oracle数据库中使用ROWNUM进行分页查询时可能出现的问题,包括记录重复和缺失。问题源于ROWNUM在排序之前生成,导致不同分页SQL执行计划差异。解决方案是在排序字段基础上增加一个唯一性字段以确保稳定排序。文章通过实例展示了ORDER BY的重要性,并通过对比不同查询执行计划解释了ROWNUM的工作原理。
摘要由CSDN通过智能技术生成

同事遇到一个奇怪的问题,在使用下面分页导记录时发现分页后的记录跟总的记录数匹配(总的记录数大概25000),但是有些记录不存在,有些重复:

 

SELECT *

  FROM (SELECT row_.*, rownum rn

          FROM (select --省略几百行

                 order by sdate, mname, blevel asc) row_

         WHERE rownum <= 10000)

WHERE RN > 0

 

SELECT *

  FROM (SELECT row_.*, rownum rn

          FROM (select --省略几百行

                 order by sdate, mname, blevel asc) row_

         WHERE rownum <= 20000)

WHERE RN > 10000

 

SELECT *

  FROM (SELECT row_.*, rownum rn

          FROM (select --省略几百行

                 order by sdate, mname, blevel asc) row_

         WHERE rownum <= 30000)

WHERE RN > 20000

 

可能原因:

1  分页1--10000,10001--2000020000--30000sql执行计划不同,造成结果集记录的顺序不同(这个也许有可能,没有验证过)

2  排序算法(原来的3个字段(sdate, mname, blevel)不能保证唯一性)

 

 

能解释的现象:

1  总的记录数是一样的:因为总的记录数是不变的,不管记录的顺序怎么变,3段加起来的和是相等的

2  3段记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值