前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【每日一摩斯】-Index Skip Scan Feature (212391.1)

【每日一摩斯】-Index Skip Scan Feature (212391.1)

作者头像
bisal
发布2019-01-29 10:57:14
3310
发布2019-01-29 10:57:14
举报

INDEX Skip Scan,也就是索引快速扫描,一般是指谓词中不带复合索引第一列,但扫描索引块要快于扫描表的数据块,此时CBO会选择INDEX SS的方式。

官方讲的,这个概念也好理解,如果将复合索引看做是一个分区表,其中分区主键(这里指的是复合索引的首列)定义了存储于此的分区数据。在每个键(首列)下的每行数据都将按照此键排序。因此在SS,首列可以被跳过,非首列可以作为逻辑子索引访问。因此一个“正常”的索引访问可以忽略首列。

复合索引被逻辑地切分成更小的子索引。逻辑子索引的个数取决于初始列的cardinality。因此尽管首列未出现在谓词中,也可能使用这个索引。、

另外,需要吧补充一点:当复合索引的第一个字段的值重复率非常低时,扫描索引的效率会比全表扫描更高,这是CBO才可能会选择使用INDEX Skip Scan的方式访问数据。

这里比较奇怪的是:

使用9i时,未使用INDEX Skip Scan:

SQL> create table at2(a varchar2(3),b varchar2(10),c varchar2(5)); Table created. SQL> begin   2    for i in 1..1000   3    loop   4    insert into at2 values('M', i, 'M');   5    insert into at2 values('F', i, 'F');   6    end loop;   7    end;   8  / PL/SQL procedure successfully completed. SQL> create index at2_i on at2(a,b,c); Index created.

SQL> exec dbms_stats.gather_table_stats(OWNNAME => NULL, TABNAME => 'at2', CASCADE => TRUE, method_opt => 'FOR ALL COLUMNS SIZE 1'); PL/SQL procedure successfully completed.

SQL> set autotrace traceonly

SQL> select * from at2 where b='352'; Execution Plan ----------------------------------------------------------    0      SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=2 Bytes=14)    1    0   INDEX (FAST FULL SCAN) OF 'AT2_I' (NON-UNIQUE) (Cost=2 Car           d=2 Bytes=14) Statistics ----------------------------------------------------------           0  recursive calls           0  db block gets          10  consistent gets           0  physical reads           0  redo size         447  bytes sent via SQL*Net to client         587  bytes received via SQL*Net from client           2  SQL*Net roundtrips to/from client           0  sorts (memory)           0  sorts (disk)           2  rows processed

使用10g的,则使用了INDEX Skip Scan:

SQL> select * from full_tbl where object_name='TEST'; Execution Plan ---------------------------------------------------------- Plan hash value: 1293869270 ------------------------------------------------------------------------------ | Id  | Operation         | Name     | Rows  | Bytes | Cost (%CPU)| Time     | ------------------------------------------------------------------------------ |   0 | SELECT STATEMENT  |          |     2 |    58 |    55   (2)| 00:00:01 | |*  1 |  TABLE ACCESS FULL| FULL_TBL |     2 |    58 |    55   (2)| 00:00:01 | ------------------------------------------------------------------------------ Predicate Information (identified by operation id): ---------------------------------------------------    1 - filter("OBJECT_NAME"='TEST')

Statistics ----------------------------------------------------------           1  recursive calls           0  db block gets         230  consistent gets           0  physical reads           0  redo size         585  bytes sent via SQL*Net to client         492  bytes received via SQL*Net from client           2  SQL*Net roundtrips to/from client           0  sorts (memory)           0  sorts (disk)           1  rows processed

难道9i和10g在选择INDEX Skip Scan还有什么不同么?

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2013年08月29日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档