索引扫描类型(此表来自网络文章) :
indexuniquescan (indexuniquescan )在使用唯一索引搜索数值时,经常会返回一个ROWID。 如果唯一索引包含多个列,即已联接索引,则至少需要创建索引createindexidx_testonemp(ename、deptno、loc ),等等可以在selectenamefromempwhereename=‘jack’and deptno=‘dev’语句中使用此索引。 如果语句只返回一行,则访问方法称为索引的唯一扫描。 selectenamefromempwheredeptno=‘dev’语句不使用此索引。 因为where子句类型没有引导列。 当存在UNIQUE或主密钥约束且保证语句只能访问单行时,Oracle经常实现唯一扫描。
索引范围扫描:1.对于unique索引,如果在where条件之后出现了between .and .则可能执行索引范围扫描,如果在where条件之后出现了=,则返回索引
对于none unique index,如果where条件之后是=,3 .组合索引,则如果where条件之后出现组合索引的引导列,则可能会执行索引范围扫描。
索引完整扫描支持全表扫描,并且还有相应的所有Oracle索引扫描。 在某些情况下,可能会执行完整Oracle索引扫描,而不是范围扫描。 请注意,完整Oracle索引扫描仅在CBO模式下有效。 只有当CBO根据统计信息发现所有Oracle索引扫描比所有表扫描更有效时,它才能运行所有Oracle索引扫描,并且所有查询的数据都必须可以直接从索引获得
索引快速完全扫描(index fast full scan )需要检索大部分数据,因为select语句之后的列包含在组合索引中,而where之后没有组合索引的引导列索引快速完全扫描的发生条件:
1 .必须是组合索引。
2 .引导列不在where条件中
当查询可以通过组合索引获得结果,并且返回的结果很少,并且where条件中不包含索引引导列时,可能会执行索引扫描
发生索引跳跃扫描的条件:
1 .必须是组合索引。
2 .引导列未显示在where条件中
数据表实验:
JL_KFBJDY
表索引: PK_JL_kfbjdy(jgbm[varchar2]、KFID[number]、QYID[number]、BJID[number] ) ) ) )。
------------- -请参阅
用例1:select * frompmsadm.JL _ kfbjdywherejgbm=' 17 '
命中结果: INDEX RANGE SCAN- PK_JL_KFBJDY
结果分析:条件字段是唯一索引的前缀,以RANGE SCAN方式命中索引
用例1-1:select * frompmsadm.JL _ kfbjdywherejgbm=' 17 ' andx=1
命中结果: INDEX RANGE SCAN- PK_JL_KFBJDY
结果分析:在用例1的基础上,以非索引字段x为条件,不影响索引命中
用例1-2:select * frompmsadm.JL _ kfbjdywherex=1andjgbm=' 17 '
命中结果: INDEX RANGE SCAN- PK_JL_KFBJDY
结果分析:基于实例1-1,从点到条件顺序,不影响索引命中
------------- -请参阅
示例2:select * frompmsadm.JL _ kfbjdywherejgbm=' 17 ' andkfid=1
命中结果: INDEX RANGE SCAN- PK_JL_KFBJDY
结果分析:条件字段是唯一索引的前缀,以RANGE SCAN方式命中索引
------------- -请参阅
用例3 :选择
* FROM PMSADM.JL_KFBJDY WHERE JGBM='17' AND KFID=1 AND QYID=1命中结果:INDEX RANGE SCAN -> PK_JL_KFBJDY
结果分析:条件字段为唯一索引的前缀,以RANGE SCAN方式命中索引
用例3-1:SELECT * FROM PMSADM.JL_KFBJDY WHEREKFID=1 AND JGBM='17' AND QYID=1
命中结果:INDEX RANGE SCAN -> PK_JL_KFBJDY
结果分析:在用例3的基础上,调整字段顺序,仍然以RANGE SCAN方式命中索引
用例3-2:SELECT * FROM PMSADM.JL_KFBJDY WHEREKFID=1 AND X=1 AND JGBM='17' AND QYID=1
命中结果:INDEX RANGE SCAN -> PK_JL_KFBJDY
结果分析:在用例3-1的基础上,加入非索引字段X,仍然以RANGE SCAN方式命中索引
------------------------------------------------------------------------------------------------------
用例4:SELECT * FROM PMSADM.JL_KFBJDY WHERE JGBM='17' AND KFID=1 AND QYID=1 AND BJID=1
命中结果:INDEX UNIQUE SCAN -> PK_JL_KFBJDY
结果分析:条件字段为唯一索引字段,命中唯一索引
用例4-1:SELECT * FROM PMSADM.JL_KFBJDY WHERE KFID=1 AND JGBM='17' AND BJID=1 AND QYID=1
命中结果:INDEX UNIQUE SCAN-> PK_JL_KFBJDY
结果分析:在用例4的基础上,打乱条件的顺序,让然能命中唯一索引,说明顺序无关
------------------------------------------------------------------------------------------------------
用例5:SELECT * FROM PMSADM.JL_KFBJDY WHERE KFID=1 AND QYID=1 AND BJID=1
命中结果:INDEX SKIP SCAN-> PK_JL_KFBJDY
结果分析:条件包含部分索引字段(非前缀),以SKIP SCAN方式命中索引
------------------------------------------------------------------------------------------------------
用例6:SELECT * FROM PMSADM.JL_KFBJDY WHERE QYID=1 AND BJID=1
命中结果:INDEX SKIP SCAN-> PK_JL_KFBJDY
结果分析:条件包含部分索引字段(非前缀),以SKIP SCAN方式命中索引
------------------------------------------------------------------------------------------------------
用例7:SELECT * FROM PMSADM.JL_KFBJDY WHERE BJID=1
命中结果:INDEX SKIP SCAN-> PK_JL_KFBJDY
结果分析:条件包含部分索引字段(非前缀),以SKIP SCAN方式命中索引
用例7-1:SELECT * FROM PMSADM.JL_KFBJDY WHERE BJID=1 AND X=1 AND Y=1
命中结果:INDEX SKIP SCAN-> PK_JL_KFBJDY
结果分析:在用例7的基础上,加入非索引字段X,Y作为条件,仍然以SKIP SCAN方式命中索引
------------------------------------------------------------------------------------------------------
用例8:SELECT * FROM PMSADM.JL_KFBJDY WHERE JGBM='17' AND KFID='1' AND QYID='1' AND BJID=1
命中结果:INDEX UNIQUE SCAN -> PK_JL_KFBJDY
结果分析:条件字段为唯一索引字段,KFID和QYID数字字段传递字符串,有类型转换过程,仍然命中唯一索引
用例8-1:SELECT * FROM PMSADM.JL_KFBJDY WHERE JGBM='17' AND KFID='1' AND QYID='1'
命中结果:INDEX RANGE SCAN -> PK_JL_KFBJDY
结果分析: 在用例8的基础上,只传递唯一索引前缀字段,同时包含类型转换,仍然以RANGE SCAN方式命中索引
用例8-2:SELECT * FROM PMSADM.JL_KFBJDY WHERE JGBM='17' AND KFID='1' AND QYID='1'
命中结果:INDEX RANGE SCAN -> PK_JL_KFBJDY
结果分析: 在用例8-1的基础上,颠倒字段顺序,仍然以RANGE SCAN方式命中索引
用例8-3:SELECT * FROM PMSADM.JL_KFBJDY WHERE JGBM='17' AND KFID='1' AND QYID='1'
命中结果:INDEX RANGE SCAN -> PK_JL_KFBJDY
结果分析: 在用例8-2的基础上,去掉前缀字段,以SKIP SCAN方式命中索引
用例8-4:SELECT * FROM PMSADM.JL_KFBJDY WHERE JGBM='17' AND KFID='1' AND QYID='1' AND X=1
命中结果:INDEX RANGE SCAN -> PK_JL_KFBJDY
结果分析: 在用例8-3的基础上,加上非索引字段X作为条件,仍然以SKIP SCAN方式命中索引
------------------------------------------------------------------------------------------------------
最终结论:
1.唯一索引的所有字段出现在条件中,会以INDEX UNIQUE SCAN方式命中索引
2.当条件字段中包含索引定义的字段顺序的前缀时,将以INDEX RANGE SCAN方式命中索引
3.当条件字段中包含索引定义的一个或多个字段,但不是前缀字段时,以INDEX SKIP SCAN方式命中索引
4.条件中字段出现的顺序不影响命中
5.条件中出现非索引字段的个数、顺序不影响索引的命中
6.条件中出现数据类型转换不影响索引的命中