索引扫描类型(该表取自网络文章):

index unique scan(索引唯一扫描)通过唯一索引查找一个数值经常返回单个ROWID。如果该唯一索引有多个列组成(即组合索引),则至少要有组合索引的引导列参与到该查询中,如创建一个索引:create index idx_test on emp(ename, deptno, loc)。则select ename from emp where ename = ‘JACK’ and deptno = ‘DEV’语句可以使用该索引。如果该语句只返回一行,则存取方法称为索引唯一扫描。而select ename from emp where

deptno = ‘DEV’语句则不会使用该索引,因为where子句种没有引导列。如果存在UNIQUE 或PRIMARY KEY 约束(它保证了语句只存取单行)的话,Oracle经常实现唯一性扫描。

index range scan(索引范围扫描):1.对于unique index来说,如果where 条件后面出现了 ,between ...and...的时候,那么就可能执行index range scan,如果where条件后面是=,那么就会执行index unique scan。

2.对于none unique index来说 如果where 条件后面出现了=,>,

3.对于组合索引来说,如果where条件后面出现了组合索引的引导列,那么可能执行index range scan。

index full scan(索引全扫描)与全表扫描对应,也有相应的全Oracle索引扫描。在某些情况下,可能进行全Oracle索引扫描而不是范围扫描,需要注意的是全Oracle索引扫描只在CBO模式下才有效。 CBO根据统计数值得知进行全Oracle索引扫描比进行全表扫描更有效时,才进行全Oracle索引扫描,而且此时查询出的数据都必须从索引中可以直接得到。

index fast full scan(索引快速全扫描):如果select 语句后面中的列都被包含在组合索引中,而且where后面没有出现组合索引的引导列,并且需要检索出大部分数据,那么这个时候可能执行index fast full scan。index fast full scan 发生的条件:

1.必须是组合索引。

2.引导列不在where条件中

index skip scan(索引跳跃式扫描)当查询可以通过组合索引得到结果,而且返回结果很少,并且where条件中没有包含索引引导列的时候,可能执行index skip scan

索引跳跃式扫描发生的条件:

1.必须是组合索引。

2.引导列没有出现在where条件中

实验针对数据表:JL_KFBJDY

表索引:PK_JL_KFBJDY(JGBM[varchar2],KFID[number],QYID[number],BJID[number])

------------------------------------------------------------------------------------------------------

用例1:SELECT * FROM PMSADM.JL_KFBJDY WHERE JGBM='17'

命中结果:INDEX RANGE SCAN -> PK_JL_KFBJDY

结果分析:条件字段为唯一索引的前缀,以RANGE SCAN方式命中索引

用例1-1:SELECT * FROM PMSADM.JL_KFBJDY WHERE JGBM='17' AND X=1

命中结果:INDEX RANGE SCAN ->

PK_JL_KFBJDY

结果分析:在用例1的基础上,加上非索引字段X作为条件,不影响索引命中

用例1-2:SELECT * FROM PMSADM.JL_KFBJDY WHERE X=1 AND JGBM='17'

命中结果:INDEX RANGE SCAN ->

PK_JL_KFBJDY

结果分析:在用例1-1的基础上,点到条件顺序,不影响索引命中

------------------------------------------------------------------------------------------------------

用例2:SELECT * FROM PMSADM.JL_KFBJDY WHERE JGBM='17' AND KFID=1

命中结果:INDEX RANGE SCAN ->

PK_JL_KFBJDY

结果分析:条件字段为唯一索引的前缀,以RANGE SCAN方式命中索引

------------------------------------------------------------------------------------------------------

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

oracle 索引命中条件,Oracle索引命中与扫描规律总结 | 学步园相关推荐

  1. oracle补充日志条件,Oracle补充日志-Oracle

    Oracle补充日志 -–补充日志 Supplemental Logging 补充日志只要是针对 UPDATE 命令的,是对重做日志记录中 变更矢量块的补充信息,增加了变更矢量记载的记录量. 日志挖掘 ...

  2. oracle存储过程 多条件,Oracle多条件查询实际分页存储过程实操

    以下的文章主要是介绍Oracle多条件查询分页存储过程,以下就是Oracle多条件查询分页存储过程具体方案的描述,希望在你今后的学习中会有所帮助.将业务逻辑放到Oracle中使得后台代码很精简,Ora ...

  3. oracle Expdp带条件,Oracle 11g expdp中query参数的使用

    Oracle 11g expdp中提供了query参数,可以在需要按条件导出表中部分数据时使用,它的使用就像是在select语句中的where条件使用一样. 数据库版本 linuxidc@ORCL&g ...

  4. oracle 完全检查点条件,ORACLE Checkpoint(检查点)

    1定义: ORACLE数据库采用"提交时并不强迫针对数据块的修改完成",而是"提交是保证修改记录(以重做日志形式)写入日志文件"的机制,来获得性能优势.即 用户 ...

  5. oracle exp根据条件,oracle exp导出加上过滤条件

    exp username/password@dbname   file='d:\hehe.dmp' tables=(%) query="""where UPDATE_DT ...

  6. oracle clob 类型条件,Oracle中Clob类型如何处理?

    Oracle中Clob类型处理解析最近利用NHibernate映射类型为Clob字段在插入数据时发现当字符的字节数(一个半角字符一个字节,一个全角字符两个字节)在 2000-4000之间时报错(ORA ...

  7. oracle 视图带条件,Oracle视图可以进行DML操作的条件

    条件一:在连接视图中不能有Order by.Group by.connetc by等语句排序语句. 条件二:基础表中所有的NOT NULL列都必须在这个视图中. 条件三:需要更新的列不是虚拟列. 条件 ...

  8. oracle 聚合函数 条件,Oracle PLSQL之HAVING后面的条件可由聚合函数构成,也可由GROUP BY后的字段构成...

    HAVING主要用于对分组后的数据进行过滤, 一般我们在其后接聚合函数(SUM,COUNT等), 除此之外我们还可以用GROUP BY后面的字段组成HAVING后的过滤条件. SQL> sele ...

  9. oracle 截取小数点_oracle函数(关于处理小数点位数和时间) | 学步园

    一:处理数字 1. 取四舍五入的几位小数 eg: round(n+0.{m个0}5, m) 比如, 取两位的话: round(15.333 + 0.005, 2) result:15.34 比如:se ...

最新文章

  1. 漂亮,LSTM模型结构的可视化
  2. mysql使用bka_MySQL Batched Key Access (BKA)原理和设置使用方法举例
  3. ajax 偶尔302,关于Ajax 中response出现302的一点见解
  4. 指标体系|四个模型教会你指标体系构建的方法
  5. Jetson TX2板载相机opencv调用打开
  6. Pytorch:函数的手动梯度计算方法
  7. UITableView长按拖动排序(支持不同行高,不同section间交换)
  8. CSS3过渡练习-进度条(CSS3)
  9. linux socket tcp程序,Linux下Socket TCP的简单例子
  10. 浅谈PageHelper插件分页实现原理及大数据量下SQL查询效率问题解决
  11. Win10没有Realtek高清晰音频管理器怎么办?
  12. android 简书饿了么,对接饿了么平台总结
  13. springboot2学习笔记:mvnw相关文件生成
  14. 猕猴桃酵素的功效_过路老熊_新浪博客
  15. Quantopian自学笔记01
  16. 百度网盘不限速(小白亲测)
  17. Unity3D笔记六 GUI游戏界面
  18. android身高控件_RuleView Android 自定义标尺控件(选择身高、体重等) @codeKK Android开源站...
  19. idea中添加查看jdk版本路径
  20. 用AutoHotkey写电脑屏幕监控软件

热门文章

  1. 屏幕尺寸/机型/系统版本判定
  2. biti_rainy的博客
  3. nacl溶解度_氯化钠溶解度 氯化钠的溶解度
  4. win7安装解压版mysql_win7安装解压缩版mysql 5.7.19和卸载后重新安装
  5. HCL_H3CNE综合实验
  6. 磨砂玻璃效果的Tab栏
  7. 预测大盘最准确的指标_杨守东:自己用多年预测大盘顶底指标公式
  8. 新疆自治区谷歌地球高程DEM等高线下载
  9. linux内存测试工具memtest,内存检测工具Memtest使用方法(图文教程)
  10. 过敏体质也会遗传给孩子,孕期妈妈应该尽早预防