rownum浅谈(一)

只要做web开发,几乎没有不需要分页查询的,在oracle中,rownum就是用来进行处理分页的。

1.rownum是oracle对结果集返回的一个伪列,也就是说是先查询完结果之后再加上的一个虚列,相当于对符合条件的结果的一个序列号。如果有结果的话,rownum伪列产生的序号是按

照数据被查询出来的顺序添加上去的, rownum总是从1开始,依次加1。

select rownum,u.* from t_user u

946313-20170510090925222-605774354.png

可以看到,rownum按序显示了。我们需要查找前10条数据

select rownum,u.* from t_user u where rownum <= 10

946313-20170510091011754-1810518365.png

数据正常查找出来,没有问题。如果我们查询结果中有排序呢,看看结果如何

select rownum,u.* from t_user u where rownum <= 10 order by u.c_id desc;

select rownum,u.* from t_user u order by u.c_id desc;

946313-20170510091018441-1148954696.png

       (第一条语句执行结果)                     

946313-20170510091036363-547796350.png

       (第二条语句执行结果)

可以看到数据没有问题,换成下面的语句

select rownum,u.* from t_user u where rownum <= 10 order by u.c_createdate desc;

select rownum,u.* from t_user u order by u.c_createdate desc;

946313-20170510091042863-1309567440.png

             (第一条语句执行结果)                            

946313-20170510091055238-1531335986.png

             (第二条语句执行结果)

可以看到,按照创建时间排序查询前10条有问题了,但是看第二条执行结果,创建时间最近的应该是chenz.ccsd而不是第一条中的43573830。为什么会这样呢?

这是因为ORACLE内部的查询优化器和索引搞的鬼。

当一条语句交给查询优化器处理时,会有两种情况:

一种如果排序列上有索引的话,则借助索引去查询数据,这样读取出来的数据是有序的,然后为排序后的数据从第一行到最后一行赋予rownum值;

另一种排序列上没有没有索引的话,则会先进行全表扫描依次读取数据,然后为数据赋予rownum值,再进行排序,此时所选取的数据就不是进行排序的了。

上面语句中c_id是有索引的,而c_createdate是没有建立索引的。

由于排序列上不一定要有索引,所以在使用rownum分页时,需要多加一层查询,以保证rownum的连续性。

转载于:https://www.cnblogs.com/superFish2016/p/6834209.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值