关于Oracle 9i 跳跃式索引扫描(Index Skip Scan)的小测试

原创 2003年10月12日 23:58:00


在Oracle9i中我们知道能够使用跳跃式索引扫描(Index Skip Scan).然而,能利用跳跃式索引扫描的情况其实是有些限制的.

从Oracle的文档中我们可以找到这样的话:

Index Skip Scans
Index skip scans improve index scans by nonprefix columns.
Often, scanning index blocks is faster than scanning table data blocks.
Skip scanning lets a composite index be split logically into smaller subindexes.
In skip scanning, the initial column of the composite index is not specified in the query.
In other words, it is skipped.

The number of logical subindexes is determined by the number of distinct values in the initial column.
Skip scanning is advantageous if there are few distinct values in the leading column of the composite
index and many distinct values in the nonleading key of the index.

也可以这样说,优化器根据索引中的前导列(索引到的第一列)的唯一值的数量决定是否使用Skip Scan.

我们首先做个测试:

SQL> CREATE TABLE test AS
  2  SELECT ROWNUM a,ROWNUM-1 b ,ROWNUM-2 c,ROWNUM-3 d,ROWNUM-4 e
  3  FROM all_objects
  4  /

SQL> SELECT DISTINCT COUNT (a) FROM test;

  COUNT(A)
----------
     28251

表已创建。

SQL>
SQL> CREATE INDEX test_idx ON test(a,b,c)
  2  /

索引已创建。

SQL> ANALYZE TABLE test COMPUTE STATISTICS
  2  FOR TABLE
  3  FOR ALL INDEXES
  4  FOR ALL INDEXED COLUMNS
  5  /

表已分析。

SQL> SET autotrace traceonly explain
SQL> SELECT *  FROM test WHERE b = 99
  2  /

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=36 Card=1 Bytes=26)
   1    0 TABLE ACCESS (FULL) OF 'TEST' (Cost=36 Card=1 Bytes=26)

--可见这里CBO选择了全表扫描.

--我们接着做另一个测试:

SQL> drop table test;

表已丢弃。

SQL> CREATE TABLE test
  2  AS
  3  SELECT DECODE(MOD(ROWNUM,2), 0, '1', '2' ) a,
  4                    ROWNUM-1 b,
  5                    ROWNUM-2 c,
  6                    ROWNUM-3 d,
  7                    ROWNUM-4 e
  8    FROM all_objects
  9  /

表已创建。

SQL> set autotrace off
SQL> select distinct a from test;

A
--
1
2

--A列只有两个唯一值

SQL> CREATE INDEX test_idx ON test(a,b,c)
  2  /

索引已创建。


SQL> ANALYZE TABLE test COMPUTE STATISTICS
  2  FOR TABLE
  3  FOR ALL INDEXES
  4  FOR ALL INDEXED COLUMNS
  5  /

表已分析。

SQL> set autotrace traceonly explain
SQL> SELECT *  FROM test WHERE b = 99
  2  /

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=4 Card=1 Bytes=24)
   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=4 Card=1 Bytes=24)
   2    1     INDEX (SKIP SCAN) OF 'TEST_IDX' (NON-UNIQUE) (Cost=3 Card=1)

 

Oracle的优化器(这里指的是CBO)能对查询应用Index Skip Scans至少要有几个条件:

1 优化器认为是合适的.
2 索引中的前导列的唯一值的数量能满足一定的条件.
3 优化器要知道前导列的值分布(通过分析/统计表得到)
4 合适的SQL语句
......


更多信息请参考:

http://www.itpub.net/showthread.php?threadid=85948

http://www.cnoug.org/bin/ut/topic_show.cgi?id=608&h=1&bpg=1&age=100

http://www.itpub.net/showthread.php?s=&postid=985602#post985602

Oracle9i Database Performance Tuning Guide and Reference Release 2 (9.2)
Part Number A96533-02

感谢参加讨论的各位高手.

Oracle 索引扫描的4种类型

根据索引的类型与where限制条件的不同,有4种类型的Oracle索引扫描: 3,4可归一种 (1) 索引唯一扫描(index uniquescan) (2) 索引范围扫描(index range...
  • warden2010
  • warden2010
  • 2013年09月17日 17:58
  • 4223

Oracle 全表扫描及其执行计划(full table scan)

Oracle 全表扫描及其执行计划(full table scan) 分类: Oracle 性能优化 2013-05-24 21:46 1300人阅读 评论(1) 收藏 举报 ...
  • haiross
  • haiross
  • 2013年11月01日 16:03
  • 6478

MySQL松散索引扫描与紧凑索引扫描

在优化group by查询的时候,一般的会想到两个名词:松散索引扫描(Loose Index Scan)和紧凑索引扫描(Tight Index Scan),因为通过这两种索引扫描就可以高效快速弟完成g...
  • tianlianchao1982
  • tianlianchao1982
  • 2016年06月02日 12:43
  • 1105

Oracle:跳跃式索引(Skip Scan Index)浅析

在Oracle9i中,有一个新的特性:跳跃式索引(Skip Scan Index)。当表有一个复合索引,而在查询中有除了索引中第一列的其他列作为条件,并且优化器模式为CBO,这时候查询计划就有可能使用...
  • zuixinnet
  • zuixinnet
  • 2013年04月13日 21:08
  • 668

Oracle 9i&10g编程艺术 性能测试

      汗,写上篇笔记已经是去年的事情了。时间过得真快啊,在这里已经工作了一年多了,感觉自己什么都没学到似的,或者说没有钻研过。从一开始用C,后来体验了 下Linux,学了点内核和Shell的...
  • songgb
  • songgb
  • 2011年01月14日 09:44
  • 379

复合索引和INDEX SKIP SCAN

今天是2014-01-21,在此学习一下复合索引和INDEX SKIP SCAN; 复合索引很简单无非就是在创建索引的时候指定接字段,但是要注意字段的选择是有一定的可参考性的,在字段选择的时候我们一般...
  • xiaohai20102010
  • xiaohai20102010
  • 2014年01月21日 20:17
  • 1212

DB2数据库查询过程(Query Processing)----复合索引的匹配索引扫描(Matching Index Scans with Composite Indexs)

在《DB2数据库查询过程(Query Processing)----简单索引访问(Simple Indexed Access)》一文中已经对索引访问的各种形式作了详细介绍,本文重点讨论匹配索引扫描...
  • idber
  • idber
  • 2012年11月17日 12:58
  • 3938

oracle 5种b*树索引扫描方式

Index scan(索引扫描index lookup): 我们通常说的一般索引都是B树索引(平衡树),有以下特性 1 叶子节点关键字为数据库值和ROWID,兄弟节点间链指针相连(字节点满了,则向...
  • kuyushow
  • kuyushow
  • 2017年10月20日 17:01
  • 112

Oracle索引扫描中的四中类型描述

我们在学习Oracle时,我们可能会遇到一些关于Oracle索引扫描操作中经常出现的问题,那么这篇文章主要介绍的是Oracle索引扫描中经常出现的问题解决方案,所以我们今天要和大家一起分享。 根...
  • jlds123
  • jlds123
  • 2011年08月30日 16:58
  • 646

分析Oracle索引扫描四大类

 学习Oracle时,你可能会遇到Oracle索引扫描问题,这里将介绍Oracle索引扫描问题的解决方法,在这里拿出来和大家分享一下。根据索引的类型与where限制条件的不同,有4种类型的Oracle...
  • csc0211
  • csc0211
  • 2011年04月03日 22:46
  • 798
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于Oracle 9i 跳跃式索引扫描(Index Skip Scan)的小测试
举报原因:
原因补充:

(最多只允许输入30个字)