目录

一、简介

二、索引唯一扫描

三、索引范围扫描

四、索引全扫描

五、索引快速全扫描

六、索引跳跃式扫描

七、总结

一、简介

Oracle提供了五种索引扫描类型,根据具体索引类型、数据分布、约束条件以及where限制的不同进行选择:

  1. 索引唯一扫描(index unique scan)
  2. 索引范围扫描(index range scan)
  3. 索引全扫描(index full scan)
  4. 索引快速扫描(index fast full scan)
  5. 索引跳跃扫描(index skip scan)

下面我们依次对每种方式进行详细的说明。

二、索引唯一扫描

简称:index unique scan

通过唯一索引查找一个数值经常返回单个ROWID。如果该唯一索引有多个列组成(即组合索引),则至少要有组合索引的引导列参与到该查询中。

如创建一个索引:

create index idx_test on emp(ename, deptno, loc)

则下面的语句可以使用该索引:

select ename from emp where ename = ‘JACK’ and deptno = ‘DEV’

如果该语句只返回一行,则存取方法称为索引唯一扫描。但是注意下面的语句不会使用该索引,因为where子句种没有引导列。

select ename from emp where deptno = ‘DEV’

如果存在UNIQUE 或PRIMARY KEY 约束(它保证了语句只存取单行)的话,Oracle经常实现唯一性扫描,索引唯一性扫描的结果最多返回一条记录。

下面通过一个简单的示例说明索引唯一扫描的场景:

【a】表结构说明:RWID、XSID、CPHJID三个字段组成组合唯一索引

【b】SQL语句 : 使用到了组合索引的三个字段,显然这三个字段组合起来能够唯一确定一条数据,所以使用到了索引唯一扫描。

explain plan for select * from zhxg_zhcp_hjcpxq t where t.rwid = '6d5ca4e1-fe93-4447-933a-e9ae5cb9cf31'and t.xsid = '5044889DBBF944E2B42B9E15E9F1CDA1' and t.cphjid = '529e35bc-1e24-4dc9-ad0e-930c4372e40f';
select * from table(dbms_xplan.display);

【c】SQL执行计划

三、索引范围扫描

简称:index range scan

  1. 当索引是组合索引时,而且select ename from emp where ename = ‘JACK’ and deptno = ‘DEV’语句返回多行数据,虽然该语句还是使用该组合索引进行查询,可此时的存取方法称为索引范围扫描。
  2. 当扫描对象是唯一性索引时,此时目标sql的where条件一定是范围查询(如between..and...、>、<、<>、>=、<=等);
  3. 当扫描对象是非唯一性索引时,此时目标sql的where条件没有限制(可以是等值,也可以是范围查询)

下面通过一个简单的示例说明索引范围扫描的场景:

explain plan for select * from vc_zhxg_xsxx_xsjbxx;select * from table(dbms_xplan.display);

【a】表结构说明

【b】执行计划

【c】索引范围扫描小总结:

使用index rang scan的3种情况:

  • (a) 在唯一索引列上使用了range操作符(> < <> >= <= between);
  • (b) 在组合索引上,只使用部分列进行查询,导致查询出多行;
  • (c) 对非唯一索引列上进行的任何查询;

四、索引全扫描

简称:index full scan

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

下面通过一个简单的示例说明索引全扫描的场景:

【a】表结构说明:ND、XSID两个字段组成组合唯一索引

【b】SQL语句 : 注意order by t.nd, t.xsid

explain plan for select * from zhxg_lx_jcsj_lxxsgl t order by t.nd,t.xsid;select * from table(dbms_xplan.display);

【c】执行计划

五、索引快速全扫描

简称:index fast full scan

扫描索引中的所有的数据块,与 index full scan很类似,但是一个显著的区别就是它不对查询出的数据进行排序,即数据不是以排序顺序被返回。在这种存取方法中,可以使用多块读功能,也可以使用并行读入,以便获得最大吞吐量与缩短执行时间。

注意点:

索引快速全扫描的执行结果不一定是有序的。这是因为索引快速全扫描时Oracle是根据索引行在磁盘上的物理存储顺序来扫描,而不是根据索引行的逻辑顺序来扫描的,所以扫描结果才不一定有序(对于单个索引叶子块中的索引行而言,其物理存储顺序和逻辑存储顺序一致;但对于物理存储位置相邻的索引叶子块而言,块与块之间索引行的物理存储顺序则不一定在逻辑上有序)。

下面通过一个简单的示例说明索引快速全扫描的场景:

【a】表结构说明:

【b】SQL语句

explain plan for select nd,xsid from zhxg_lx_jcsj_lxxsgl t;select * from table(dbms_xplan.display);

【c】执行计划

六、索引跳跃式扫描

简称:INDEX SKIP SCAN

主要发生在多个列建立的组合索引上,如果SQL中谓词条件只包含索引中的部分列,并且这些列不是建立索引时的第一列时,就可能发生INDEX SKIP SCAN。这里SKIP的意思是因为查询条件没有第一列或前面几列,被忽略了。

下面通过一个简单的示例说明索引跳跃式扫描的场景:

【a】表结构说明:RWID、XSID、CPHJID三个字段组成一个唯一组合索引

【b】SQL语句:使用到了索引列的第一列RWID和第二列XSID

explain plan for select * from zhxg_zhcp_hjcpxq t where t.rwid = '6d5ca4e1-fe93-4447-933a-e9ae5cb9cf31'and t.xsid = '5044889DBBF944E2B42B9E15E9F1CDA1';
select * from table(dbms_xplan.display);

【c】执行计划:很显然,肯定走索引,而且是索引范围扫描

观察下面的SQL,使用到了RWID、XSID、CPHJID三个索引,显然三者组合唯一,使用到唯一索引扫描。

explain plan for select * from zhxg_zhcp_hjcpxq t where t.rwid = '6d5ca4e1-fe93-4447-933a-e9ae5cb9cf31'and t.xsid = '5044889DBBF944E2B42B9E15E9F1CDA1' and t.cphjid = '529e35bc-1e24-4dc9-ad0e-930c4372e40f';
select * from table(dbms_xplan.display);

再观察下面的SQL,使用到组合索引的第二列XSID和第三列CPHJID,注意到这里跳过了第一列引导列索引RWID,这其实就是索引跳跃现象,显然使用到的就是索引跳跃式扫描,在开发中我们应尽量避免出现索引跳跃。

explain plan for select * from zhxg_zhcp_hjcpxq t where t.xsid = '5044889DBBF944E2B42B9E15E9F1CDA1' and t.cphjid = '529e35bc-1e24-4dc9-ad0e-930c4372e40f';
select * from table(dbms_xplan.display);

七、总结

以上就是关于Oracle中常见的五种索引扫描方式的总结,主要注意下面几点,能有效提高SQL查询效率。

  1. 尽可能使SQL走唯一索引扫描和索引范围扫描;
  2. 至于索引全扫描可能遇到的较少些,一般出现了再具体分析下;
  3. 尽量避免出现索引跳跃现象,尽量满足Oracle索引最左前缀匹配原则;

参考资料:

https://www.cnblogs.com/zwl715/p/3601137.html

https://blog.csdn.net/choubei6141/article/details/100741178

https://www.cnblogs.com/yumiko/p/5972246.html

Oracle常见索引扫描方式总结相关推荐

  1. Oracle索引扫描方式

    文章目录 0.参考资料 1.索引扫描方式和索引类型概述 2.索引唯一扫描(index unique scan) 3.索引范围扫描(index range scan) 4.索引跳跃扫描(index sk ...

  2. oracle松散索引扫描,oracle跳跃式索引扫描测试

    Oracle 中我们知道能够使用跳跃式索引扫描(Index Skip Scan).然而,能利用跳跃式索引扫描的情况其实是有些限制的CREATE TABLE test AS SELECT ROWNUM ...

  3. oracle建立覆盖索引,oracle索引类型及扫描方式大整理

    oracle索引类型及扫描方式大整理 1. 存储类型 索引在各种关系型数据库系统中都是举足轻重的组成部分,其对于提高检索数据的速度起至关重要的作用.在Oracle中,索引基本分为以下几种:B*Tree ...

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

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

  5. 【模块介绍】6×6矩阵键盘(硬件部分和扫描方式)

    目录 概述 原理图 扫描方式 扫描法 单个按键按下 多个按键按下 行反转法 图解 成品 概述 矩阵键盘非常常见 就是利用键盘组成矩阵来减少IO口的使用 做成6×6的矩阵键盘可以使用12个IO口读取36 ...

  6. Oracle 表的访问方式(2)-----索引扫描

    索引扫描(Index scan) 我们先通过index查找到数据对应的rowid值(对于非唯一索引可能返回多个rowid值),然后根据rowid直接从表中得到具体的数据,这种查找方式称为索引扫描或索引 ...

  7. oracle 取第三大的值,Oracle 常见的几种访问提取数据的方式!

    oracle中常见的几种提取数据的方式可以分为三大类:全表扫描,通过rowid访问和索引扫描.下面先看一下全表扫描. 1.table full scan全表扫描:这个应该是平时工作中比较常见,一般在返 ...

  8. 常见的几种索引扫描类型

    一.如何查看SQL语句的执行计划 1.在SQL*PLUS环境中 执行SET AUTOTRACE ON 可以打开启动自动跟踪功能,如下(下面的红色字体是敲入的命令): ChenZw> set au ...

  9. Oracle 索引扫描的五种类型

    之前在讨论CBO和RBO的时候提到了索引扫描的几种类型. Oracle Optimizer CBO RBO http://blog.csdn.net/tianlesoftware/archive/20 ...

  10. PostgreSQL Oracle 兼容性之 - INDEX SKIP SCAN (递归查询变态优化) 非驱动列索引扫描优化...

    标签 PostgreSQL , Oracle , index skip scan , 非驱动列条件 , 递归查询 , 子树 背景 对于输入条件在复合索引中为非驱动列的,如何高效的利用索引扫描? 在Or ...

最新文章

  1. 把文件自动add_【Blender】常用Add-Ons
  2. C++11:继承构造函数
  3. 大学生学编程系列」第五篇:自学编程需要多久才能找到工作?
  4. CentOS7 FTP安装与配置
  5. echarts热力地图
  6. kafka Failed to send producer
  7. a的n次方的快速算法及大数相乘
  8. linux dd后无法启动盘,dd后新盘系统无法启动,解决(上)
  9. oracle sql列转行_SQL列转行及行转列
  10. 华为网吧服务器型号,网吧服务器 主机配置
  11. matlab四面体网格分割,分割球面
  12. 阿里云商标注册入口(附商标申请流程)
  13. matlab拓扑图画法,告诉你漂亮标准的网络拓扑图是怎么画出来的?
  14. 企业内网信息安全实践-记ChinaUnix技术交流
  15. 程序猿段子_程序员的十个段子,能看懂的都是深有同感!
  16. 《解构产品经理互联网产品策划入门》PDF+《互联网产品运营产品经理的10堂精英课》PDF分析...
  17. pyton入门 — 其他常用语法
  18. win7上怎么安装linux系统安装教程,怎么装系统双系统安装教程 win7 linux
  19. Windows 桌面主题 1.2
  20. 年度十佳电商网站设计赏析

热门文章

  1. take android,Protake
  2. 阿里云云计算 17 块存储的分类
  3. 李沐亚马逊资深首席科学家 - 动手学深度学习v2 -2安装
  4. java 装饰者模式 替代方案_如何利用装饰者模式在不改变原有对象的基础上扩展功能...
  5. 代码修改及模型复查 12-6
  6. 计算机windows8黑屏怎么办,详解笔记本电脑出现电源拔出就黑屏的win8处理教程
  7. html5绘制警告牌,2.10 创建自定义图形:绘制扑克牌花色 - HTML5 Canvas 实战
  8. python3.6下载opencv_ubuntu16.04+anaconda3+python3.6安装OpenCV3
  9. 常见查找算法之—二分查找
  10. 在linux服务器上安装sublime编辑器