学习Oracle时,你可能会遇到Oracle索引扫描问题,这里将介绍Oracle索引扫描问题的解决方法,在这里拿出来和大家分享一下。根据索引的类型与where限制条件的不同,有4种类型的Oracle索引扫描:
◆索引唯一扫描(index unique scan)
◆索引范围扫描(index range scan)
◆索引全扫描(index full scan)
◆索引快速扫描(index fast full scan)
(1) 索引唯一扫描(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经常实现唯一性扫描。
使用唯一性约束的例子:
    SQL> explain plan for  
    select empno,ename from emp where empno=10;  
    Query Plan  
    SELECT STATEMENT [CHOOSE] Cost=1 
    TABLE ACCESS BY ROWID EMP [ANALYZED]  
    INDEX UNIQUE SCAN EMP_I1 
(2) 索引范围扫描(index range scan)
      使用一个索引存取多行数据,同上面一样,如果索引是组合索引,如(1)所示,而且select ename from emp where ename = ‘JACK’ and deptno = ‘DEV’语句返回多行数据,虽然该语句还是使用该组合索引进行查询,可此时的存取方法称为索引范围扫描。在唯一索引上使用索引范围扫描的典型情况下是在谓词(where限制条件)中使用了范围操作符(如>、<、<>、>=、<=、between)
使用索引范围扫描的例子:
    SQL> explain plan for select empno,ename from emp  
    where empno > 7876 order by empno;  
    Query Plan  
    SELECT STATEMENT [CHOOSE] Cost=1 
    TABLE ACCESS BY ROWID EMP [ANALYZED]  
    INDEX RANGE SCAN EMP_I1 [ANALYZED] 
在非唯一索引上,谓词col = 5可能返回多行数据,所以在非唯一索引上都使用索引范围扫描。
使用index rang scan的3种情况:
(a) 在唯一索引列上使用了range操作符(> < <> >= <= between)
(b) 在组合索引上,只使用部分列进行查询,导致查询出多行
(c) 对非唯一索引列上进行的任何查询。
(3) 索引全扫描(index full scan)
      与全表扫描对应,也有相应的全Oracle索引扫描。在某些情况下,可能进行全Oracle索引扫描而不是范围扫描,需要注意的是全Oracle索引扫描只在CBO模式下才有效。 CBO根据统计数值得知进行全Oracle索引扫描比进行全表扫描更有效时,才进行全Oracle索引扫描,而且此时查询出的数据都必须从索引中可以直接得到。
全Oracle索引扫描的例子:
    An Index full scan will not perform single block i/o's and so it may prove to be inefficient.  
    e.g.  
    Index BE_IX is a concatenated index on big_emp (empno, ename)  
    SQL> explain plan for select empno, ename from big_emp order by empno,ename;  
    Query Plan  
    SELECT STATEMENT [CHOOSE] Cost=26 
    INDEX FULL SCAN BE_IX [ANALYZED] 
(4) 索引快速扫描(index fast full scan)
      扫描索引中的所有的数据块,与 index full scan很类似,但是一个显著的区别就是它不对查询出的数据进行排序,即数据不是以排序顺序被返回。在这种存取方法中,可以使用多块读功能,也可以使用并行读入,以便获得最大吞吐量与缩短执行时间。
索引快速扫描的例子:
    SQL> explain plan for select empno,ename from big_emp;  
    Query Plan  
    SELECT STATEMENT [CHOOSE] Cost=1 
    INDEX FAST FULL SCAN BE_IX [ANALYZED]  
    SQL> explain plan for select ename from big_emp;  
    Query Plan  
    SELECT STATEMENT [CHOOSE] Cost=1 
    INDEX FAST FULL SCAN BE_IX [ANALYZED] 
CUUG
更多oracle视频教程请点击:http://crm2.qq.com/page/portalpage/wpa.php?uin=800060152&f=1&ty=1&aty=0&a=&from=6

转载于:https://blog.51cto.com/19880614/1140277

Oracle教程之分析Oracle索引扫描四大类相关推荐

  1. Oracle索引扫描四大类的分析

    学习Oracle时,你可能会遇到Oracle索引扫描问题,这里将介绍Oracle索引扫描问题的解决方法,在这里拿出来和大家分享一下.根据索引的类型与where限制条件的不同,有4种类型的Oracle索 ...

  2. python3连接oracle教程,python3连接oracle数据库

    我这里使用的版本是python3.6 64位 ,cx_Oracle-5.3-11g.win-amd64-py3.6-2和instantclient-basic-windows.x64-18.5.0.0 ...

  3. Oracle数据库碎片分析,oracle数据库碎片概念与分析

    什么是oracle的碎片呢,百度一大片关于oracle碎片的概念,以前看了一两遍,以为看了就了解了碎片了,其实不然,在百度上看的内容如下 ------------------------------- ...

  4. oracle教程新w3c,Oracle技术教程

    新版w3school学院编写了全新的Oracle技术教程 SQL 简介 SQL (Structured Query Language,结构化查询语言)支持如下类别命令: 数据定义语言:CREATE(创 ...

  5. python3连接oracle教程_python3 连接oracle

    ```````````` 之前没有用过oracle 数据库,这家是oracle ,天天测试需要修改数据数据,所以自己想用代码实现,当连接oracle 的时候肯定上网找用到哪些包,如何初始化实例啊,结果 ...

  6. oracle addm报告分析,Oracle addm

    ADDM(Automatic Database Diagnostic Monitor) 是植入Oracle数据库的一个自诊断引擎.ADDM 通过检查和分析AWR获取的数据来判断Oracle数据库中可能 ...

  7. oracle 如何表分析,ORACLE的表分析策略

    对表进行分析,通常情况下可以对表,索引,列进行单独分析,或者进行组合分析,但这三者哪些是相对重要的,哪些分析显得不那么重要?通过本篇文章的实验相信大家也会对直方图有更一步的了解. 1.首先创建测试表, ...

  8. oracle log.xml分析,Oracle 11g Alert Log日志位置及参数

    ORACLE加强对EM的开发,很多变化都是为em服务的,其趋势是通过em完成大部分操作与管理. Oracle 11g 数据库以 XML 与传统的文本两种格式提供 Alert 日志. ALERT日志位置 ...

  9. Oracle索引梳理系列(八)- 索引扫描类型及分析(高效索引必备知识)

    理解oracle索引扫描类型的特点以及具体触发的条件,对于通过合理地使用索引,进行sql优化至关重要(例如组合索引的引导列的选择问题). 在总结索引扫描类型前,需要再次强调关于索引特点的几个关键点: ...

最新文章

  1. python中给出一个不超过10的正整数n_求计算机大佬解答python题
  2. CentOS安装mariadb
  3. PieLove 之 数据分析帝.(ZZ)(is2120)
  4. java 链接占用太多_Java程序链接数过多导致java.net.SocketException: No buffer space available问题...
  5. 在统一软件开发过程中使用UML
  6. 修改linux绑定的域名,手工修改linux系统下DA面板绑定的域名
  7. AudioParam
  8. protobuf使用错误总结
  9. 简单理解Momentum,RMSprop,Adam优化算法
  10. The requested PHP extension ext-redis * is missing from your system. Install or enable PHP's redis e
  11. 【蓝桥杯嵌入式】关于CT117E下载程序出问题解决方案(含keil mdk4和keil mdk5移植)
  12. matlab实现卷积编码与viterbi译码
  13. CentOS支持NTFS格式
  14. 硬核照片显示,魔方即视感
  15. ubuntu18.04上的draftsight 2D的安装
  16. SQL注入的测试方法
  17. LDAP添加 memberOf 模块
  18. CPU内部结构图和MicroBlaze内部结构图对比
  19. Event Loop 事件循环简介
  20. Tomcat集群通过redis实现session共享

热门文章

  1. 如何为prel语言加载模块_WebAssembly 系列(第四部分)- 创建和使用WebAssembly模块...
  2. 屏幕的宽度_交互规范:响应式让屏幕利用更高,用户体验更佳
  3. html动态生成按钮事件,javascript 动态生成按钮并添加事件时为什么不响应?
  4. android wear ios表盘,秒杀 Apple Watch,Android Wear 又有 17 款新表盘可以玩啦!
  5. Mac ssh-key 对应git账户
  6. 硬编码与非硬编码(软编码)区别
  7. Java学习笔记2.4.3 选择结构 - 多分支结构
  8. Spring Boot基础学习笔记10:配置国际化页面
  9. 大数据学习笔记25:MR案例——自定义输入输出格式处理个人成绩
  10. 安卓案例:表达式计算器