注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

无线时代辐射无穷

抓紧生宝宝,小心辐射

 
 
 

日志

 
 

关于使用索引排序 desc 和 asc  

2010-01-20 11:48:04|  分类: oracle |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

http://www.itpub.net/thread-284660-1-1.html

关于使用索引排序 desc 和 asc

例子如下
首先建立环境

QUOTE:
SQL> create table t nologging as select * from dba_objects;

表已创建。

SQL> insert /*+ append */into t select *from t;

已创建33599行。

SQL> commit;

提交完成。

SQL> insert /*+ append */into t select *from t;

已创建67198行。

SQL> commit;

提交完成。

SQL> insert /*+ append */into t select *from t;

已创建134396行。

SQL> commit;

提交完成。

SQL> update t set object_id=rownum;

已更新268792行。

SQL> alter table t add primary key(object_Id) nologging;

表已更改

SQL> create unique index tdix on t(object_type,created desc,object_id desc) nolo
gging;

索引已创建。

SQL> analyze table t compute statistics;

表已分析。

开始查询

QUOTE:
  按照索引排序的顺序

SQL> select /*+ first_rows  */table_a.*,rownum from (select
  2  /*+ first_rows */* FROM   t
  3    WHERE object_type='TABLE'
  4       order by created desc,object_id desc )  table_a where rownum<=20
  5  ;

已选择20行。

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=HINT: FIRST_ROWS (Cost=3791 Card=
          20 Bytes=3540)

   1    0   COUNT (STOPKEY)
   2    1     VIEW (Cost=3791 Card=7906 Bytes=1399362)
   3    2       TABLE ACCESS (BY INDEX ROWID) OF 'T' (Cost=3791 Card=7
          906 Bytes=679916)

   4    3         INDEX (RANGE SCAN) OF 'TDIX' (UNIQUE) (Cost=22 Card=
          7906)

Statistics
----------------------------------------------------------
          3  recursive calls
          0  db block gets
         26  consistent gets
          0  physical reads
          0  redo size
       1759  bytes sent via SQL*Net to client
        514  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
         20  rows processed

下面按照索引排序的逆序查询

SQL> select /*+ first_rows  */table_a.*,rownum from (select
  2  /*+ first_rows */* FROM   t
  3    WHERE object_type='TABLE'
  4       order by created asc,object_id asc )  table_a where rownum<=20;

已选择20行。

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=HINT: FIRST_ROWS (Cost=3794 Card=
          20 Bytes=3540)

   1    0   COUNT (STOPKEY)
   2    1     VIEW (Cost=3794 Card=7906 Bytes=1399362)
   3    2       SORT (ORDER BY STOPKEY) (Cost=3794 Card=7906 Bytes=679
          916)
   4    3         TABLE ACCESS (BY INDEX ROWID) OF 'T' (Cost=3791 Card
          =7906 Bytes=679916)

   5    4           INDEX (RANGE SCAN) OF 'TDIX' (UNIQUE) (Cost=22 Car
          d=7906)
Statistics
----------------------------------------------------------
          3  recursive calls
          0  db block gets
       7604  consistent gets
          0  physical reads
          0  redo size
       1861  bytes sent via SQL*Net to client
        514  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          2  sorts (memory)
          0  sorts (disk)
         20  rows processed

发现 Range Scan Index  后才作了排序SORT (ORDER BY STOPKEY
似乎 oracle 逆序Range Scan 索引有问题???



QUOTE:
再建立一个反相的ASC排序索引

SQL> create unique index tdixasc on t(object_type,created asc,object_id asc) nol
ogging;

索引已创建。

SQL> analyze index  tdixasc compute statistics;

索引已分析

SQL> select     INDEX_name,     blevel,    avg_data_blocks_per_key,        avg_l
eaf_blocks_per_key,        clustering_factor from       user_indexes where table
_name='T';

INDEX_NAME                         BLEVEL AVG_DATA_BLOCKS_PER_KEY
------------------------------ ---------- -----------------------
AVG_LEAF_BLOCKS_PER_KEY CLUSTERING_FACTOR
----------------------- -----------------
SYS_C0014838                            1                       1
                      1              1808

TDIX                                    2                       1
                      1            127784

TDIXASC                                 1                       1
                      1            127784

再进行查询

QUOTE:
SQL> SET AUTOTRACE traceonly stat exp
SQL> select /*+ first_rows  */table_a.*,rownum from (select
  2  /*+ first_rows */* FROM   t
  3    WHERE object_type='TABLE'
  4       order by created asc,object_id asc )  table_a where rownum<=20;

已选择20行。


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=HINT: FIRST_ROWS (Cost=3789 Card=
          20 Bytes=3540)

   1    0   COUNT (STOPKEY)
   2    1     VIEW (Cost=3789 Card=7906 Bytes=1399362)
   3    2       TABLE ACCESS (BY INDEX ROWID) OF 'T' (Cost=3789 Card=7
          906 Bytes=679916)

   4    3         INDEX (RANGE SCAN) OF 'TDIXASC' (UNIQUE) (Cost=20 Ca
          rd=7906)

Statistics
----------------------------------------------------------
          3  recursive calls
          0  db block gets
         17  consistent gets
          0  physical reads
          0  redo size
       1861  bytes sent via SQL*Net to client
        514  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
         20  rows processed

SQL> select /*+ first_rows  */table_a.*,rownum from (select
  2  /*+ first_rows */* FROM   t
  3    WHERE object_type='TABLE'
  4       order by   created desc,object_id desc )  table_a where rownum<=20;

已选择20行。

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=HINT: FIRST_ROWS (Cost=3792 Card=
          20 Bytes=3540)

   1    0   COUNT (STOPKEY)
   2    1     VIEW (Cost=3792 Card=7906 Bytes=1399362)
   3    2       SORT (ORDER BY STOPKEY) (Cost=3792 Card=7906 Bytes=679
          916)

   4    3         TABLE ACCESS (BY INDEX ROWID) OF 'T' (Cost=3789 Card
          =7906 Bytes=679916)

   5    4           INDEX (RANGE SCAN) OF 'TDIXASC' (UNIQUE) (Cost=20
          Card=7906)

Statistics
----------------------------------------------------------
          3  recursive calls
          0  db block gets
       8119  consistent gets
          0  physical reads
          0  redo size
       1759  bytes sent via SQL*Net to client
        514  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          2  sorts (memory)
          0  sorts (disk)
         20  rows processed

发现 oracle 只使用最后建立的那个索引 并且在逆序读取上存在问题


SQL> select *from v$version;

BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
PL/SQL Release 9.2.0.4.0 - Production
CORE    9.2.0.3.0       Production
TNS for 32-bit Windows: Version 9.2.0.4.0 - Production
NLSRTL Version 9.2.0.4.0 - Production
是不是存在版本的问题哪?
大家也试试
Thanks Very Much!
  评论这张
 
阅读(1566)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017