ITPub博客

首页 > Linux操作系统 > Linux操作系统 > ORACLE分页查询基于索引的考虑

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

原创 Linux操作系统 作者:wsbupt 时间:2009-06-01 20:49:48 0 删除 编辑

分页查询在应用中使用非常广泛,在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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-01-20

  • 博文量
    16
  • 访问量
    31476