oracle分页 上下限,oracle中rownum小于xxx分页,排序不稳定

相当数量的blog互相参照,提供类似下列的高效率查询sql,单在分页查询中,由于oracle会进行

排序查询算法的优化,造成排序结果不稳定,不应采用下列方法。

SELECT *

FROM (SELECT tt.*, ROWNUM AS rowno

FROM (  SELECT t.*

FROM emp t

WHERE hire\_date BETWEEN TO\_DATE ("20060501", "yyyymmdd")

AND TO_DATE ("20060731", "yyyymmdd")

ORDER BY create\_time DESC, emp\_no) tt

WHERE ROWNUM <= 20) table_alias

WHERE table_alias.rowno >= 10;

原因:优化器采用了“SORT (ORDER BY STOPKEY)”。

“SORT (ORDER BY STOPKEY)”不需要对所有数据进行排序,而是只要找出结果集中的按特定顺序的最前N条记录,一旦找出了这N条记录,就无需再对剩下的数据进行排序,而直接返回结果。

这种算法我们可以视为是“快速排序”算法的变种。快速排序算法的基本思想是:先将数据分2组集合,保证第一集合中的每个数据都大于第二个集合中每个数据,然后再按这个原则对每个集合进行递归分组,

直到集合的单位最小。在进行“SORT (ORDER BY STOPKEY)”时,首先找出N条数据(这些数据并没有做排序)放在第一组,保证第一组的数据都大于第二组的数据,然后只对第一组数据进行递归。

可以看到,基于这样的算法基础上,如果N的数值不同,数据的分组也不同(如N=20时,第一次分组比例为12:8,然后继续递归;当N=10时,第一次分组比例为3:7 … …),这样,在数据的排序字段值都相等时,

输出结果的顺序就会因为N值不同而不同。即在排序键值重复时,非稳定排序算法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值