ORACLE分页查询基于索引的考虑

分页查询在应用中使用非常广泛,在oracle中最常用的做法是使用rownum进行分页查询。  比如:

select *
  from (select rownum rnm, z.*
          from (select *
                  from t 
                  where Sell_member_id = 'wangsai'
                 order by YYYYMMDD desc, score desc,buy_member_id desc
                 ) z
          where rownum<=6
       )
 where rnm > 0

上面SQL中我们只对Sell_member_id做筛选条件,而对YYYYMMDD desc, score desc,buy_member_id desc个字段进行了排序操作。首先我们看第一种情况,只在Sell_member_id 上建立一个索引。并进行它查看执行计划。

---------------------------------------------------------------------------
| Id  | Operation                               | Name                    |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT                        |                         |
|*  1 |  VIEW                                   |                         |
|*  2 |   COUNT STOPKEY                         |                         |
|   3 |    VIEW                                 |                         |
|*  4 |     SORT ORDER BY STOPKEY               |                         |
|*  5 |      FILTER                             |                         |
|*  6 |       TABLE ACCESS BY GLOBAL INDEX ROWID| CN_BRMMS_M_SCORE_SUMDT1 |
|*  7 |        INDEX RANGE SCAN                 | IDX_CN_BRMMS_M_SCORE_S  |
---------------------------------------------------------------------------

接下来我们基于所有的排序字段 YYYYMMDD,score ,buy_member_id字段建立索引,重新查看执行计划,我们可以看到执行计划中少了一次SORT ORDER BY STOPKEY,同时也会减少大量的一致性读(consistent gets)操作。


----------------------------------------------------------------------------
| Id  | Operation                              | Name                      |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT                       |                           |
|*  1 |  VIEW                                  |                           |
|*  2 |   COUNT STOPKEY                        |                           |
|   3 |    VIEW                                |                           |
|*  4 |     FILTER                             |                           |
|   5 |      TABLE ACCESS BY GLOBAL INDEX ROWID| CN_BRMMS_M_SCORE_SUMDT1   |
|*  6 |       INDEX RANGE SCAN DESCENDING      | IDX_CN_BRMMS_M_SCORE_SYSB |
----------------------------------------------------------------------------

 

然而排序字段的排序顺序对执行计划有影响吗,答案是肯定的,当我们改成:order by YYYYMMDD desc, score desc,buy_member_id asc时再次查看执行计划,同样会有SORT ORDER BY STOPKEY。

------------------------------------------------------------------------------
| Id  | Operation                               | Name                      |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                        |                           |
|*  1 |  VIEW                                   |                           |
|*  2 |   COUNT STOPKEY                         |                           |
|   3 |    VIEW                                 |                           |
|*  4 |     SORT ORDER BY STOPKEY               |                           |
|*  5 |      FILTER                             |                           |
|   6 |       TABLE ACCESS BY GLOBAL INDEX ROWID| CN_BRMMS_M_SCORE_SUMDT1   |
|*  7 |        INDEX RANGE SCAN                 | IDX_CN_BRMMS_M_SCORE_SYSB |
------------------------------------------------------------------------------

总结:
  
oracle分页查询一般是WEB访问应用,对查询速度要求极高。当分页中又涉及排序的操作时,正确的B树索引建立,有效的避免排序. 因为B树索引是按顺序组织数据在树的叶子节点上。
同时我们要注意的是保持排序的一致性。
另外:在使用rownum排序分页时一定要保证排序字段的唯一性,不然会导致分页错误。

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/77270/viewspace-604862/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/77270/viewspace-604862/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值