复合索引的建立需要考虑两个方面:前导列和高选择性

前导列:建立一个复合索引(a,b,c),a是这个复合索引的第一列称为前导列

当我们使用到这个复合索引的时候,查询条件中未使用到前导列,如:select * from  table  where b=? and c=? ,一般情况下,不会使用到该复合索引。

之所以指特殊情况是因为在ORACLE 10g中CBO完全取代RBO,CBO通过计算各种可能的执行计划所需的cost,取cost最低的执行计划作为最终的执行方案,它依赖于数据库对象中的统计信息,像上面的sql就是依赖于table表的统计信息,根据当前的统计信息生成一个该sql的最优执行计划,统计信息在oracle中有定时job,晚上进行统计,也可以我们手动进行统计,我们可以通过dba_tables和dba_tab_partitions中的LAST_ANALYZED来查看表的具体统计信息时间。

所以当CBO全面取代RBO后,我们在未使用到复合索引的前导列时,我们有可能会使用到  INDEX SKIP SCAN(复合索引之索引跳跃扫描)

使用 INDEX SKIP SCAN有一个前提条件:在我们的查询条件中没有复合索引的前导列时,优化器发现我们的前导列的数据选择性低,会将每个数值都作为常规扫描的入口,在此基础上做一次查找,最后合并这些查询;

 

高选择性:指的是该列的数据基本都不一样,重复性低,如主键等

在上面说的INDEX SKIP SCAN使用的前提条件中,是以前导列的数据选择性低为前提,优化器估算索引跳跃扫描的成本低于其他扫描方式的成本时,使用该索引。

但我们一般建立复合索引时应按字段可选性(即值的多少)的高低进行排列,索引的选择性越高,针对每个不同值平均返回的行数也越少。