首页 > 编程知识 正文

oracle查看是否走了索引,oracle删除表会删除索引吗

时间:2023-05-05 13:36:03 阅读:110664 作者:4575

索引扫描类型(此表来自网络文章) :

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.条件中出现数据类型转换不影响索引的命中

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。