Oracle常见索引扫描方式总结
目录
一、简介
二、索引唯一扫描
三、索引范围扫描
四、索引全扫描
五、索引快速全扫描
六、索引跳跃式扫描
七、总结
一、简介
Oracle提供了五种索引扫描类型,根据具体索引类型、数据分布、约束条件以及where限制的不同进行选择:
- 索引唯一扫描(index unique scan)
- 索引范围扫描(index range scan)
- 索引全扫描(index full scan)
- 索引快速扫描(index fast full scan)
- 索引跳跃扫描(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
- 当索引是组合索引时,而且select ename from emp where ename = ‘JACK’ and deptno = ‘DEV’语句返回多行数据,虽然该语句还是使用该组合索引进行查询,可此时的存取方法称为索引范围扫描。
- 当扫描对象是唯一性索引时,此时目标sql的where条件一定是范围查询(如between..and...、>、<、<>、>=、<=等);
- 当扫描对象是非唯一性索引时,此时目标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查询效率。
- 尽可能使SQL走唯一索引扫描和索引范围扫描;
- 至于索引全扫描可能遇到的较少些,一般出现了再具体分析下;
- 尽量避免出现索引跳跃现象,尽量满足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常见索引扫描方式总结相关推荐
- Oracle索引扫描方式
文章目录 0.参考资料 1.索引扫描方式和索引类型概述 2.索引唯一扫描(index unique scan) 3.索引范围扫描(index range scan) 4.索引跳跃扫描(index sk ...
- oracle松散索引扫描,oracle跳跃式索引扫描测试
Oracle 中我们知道能够使用跳跃式索引扫描(Index Skip Scan).然而,能利用跳跃式索引扫描的情况其实是有些限制的CREATE TABLE test AS SELECT ROWNUM ...
- oracle建立覆盖索引,oracle索引类型及扫描方式大整理
oracle索引类型及扫描方式大整理 1. 存储类型 索引在各种关系型数据库系统中都是举足轻重的组成部分,其对于提高检索数据的速度起至关重要的作用.在Oracle中,索引基本分为以下几种:B*Tree ...
- Oracle索引梳理系列(八)- 索引扫描类型及分析(高效索引必备知识)
理解oracle索引扫描类型的特点以及具体触发的条件,对于通过合理地使用索引,进行sql优化至关重要(例如组合索引的引导列的选择问题). 在总结索引扫描类型前,需要再次强调关于索引特点的几个关键点: ...
- 【模块介绍】6×6矩阵键盘(硬件部分和扫描方式)
目录 概述 原理图 扫描方式 扫描法 单个按键按下 多个按键按下 行反转法 图解 成品 概述 矩阵键盘非常常见 就是利用键盘组成矩阵来减少IO口的使用 做成6×6的矩阵键盘可以使用12个IO口读取36 ...
- Oracle 表的访问方式(2)-----索引扫描
索引扫描(Index scan) 我们先通过index查找到数据对应的rowid值(对于非唯一索引可能返回多个rowid值),然后根据rowid直接从表中得到具体的数据,这种查找方式称为索引扫描或索引 ...
- oracle 取第三大的值,Oracle 常见的几种访问提取数据的方式!
oracle中常见的几种提取数据的方式可以分为三大类:全表扫描,通过rowid访问和索引扫描.下面先看一下全表扫描. 1.table full scan全表扫描:这个应该是平时工作中比较常见,一般在返 ...
- 常见的几种索引扫描类型
一.如何查看SQL语句的执行计划 1.在SQL*PLUS环境中 执行SET AUTOTRACE ON 可以打开启动自动跟踪功能,如下(下面的红色字体是敲入的命令): ChenZw> set au ...
- Oracle 索引扫描的五种类型
之前在讨论CBO和RBO的时候提到了索引扫描的几种类型. Oracle Optimizer CBO RBO http://blog.csdn.net/tianlesoftware/archive/20 ...
- PostgreSQL Oracle 兼容性之 - INDEX SKIP SCAN (递归查询变态优化) 非驱动列索引扫描优化...
标签 PostgreSQL , Oracle , index skip scan , 非驱动列条件 , 递归查询 , 子树 背景 对于输入条件在复合索引中为非驱动列的,如何高效的利用索引扫描? 在Or ...
最新文章
- 把文件自动add_【Blender】常用Add-Ons
- C++11:继承构造函数
- 大学生学编程系列」第五篇:自学编程需要多久才能找到工作?
- CentOS7 FTP安装与配置
- echarts热力地图
- kafka Failed to send producer
- a的n次方的快速算法及大数相乘
- linux dd后无法启动盘,dd后新盘系统无法启动,解决(上)
- oracle sql列转行_SQL列转行及行转列
- 华为网吧服务器型号,网吧服务器 主机配置
- matlab四面体网格分割,分割球面
- 阿里云商标注册入口(附商标申请流程)
- matlab拓扑图画法,告诉你漂亮标准的网络拓扑图是怎么画出来的?
- 企业内网信息安全实践-记ChinaUnix技术交流
- 程序猿段子_程序员的十个段子,能看懂的都是深有同感!
- 《解构产品经理互联网产品策划入门》PDF+《互联网产品运营产品经理的10堂精英课》PDF分析...
- pyton入门 — 其他常用语法
- win7上怎么安装linux系统安装教程,怎么装系统双系统安装教程 win7 linux
- Windows 桌面主题 1.2
- 年度十佳电商网站设计赏析
热门文章
- take android,Protake
- 阿里云云计算 17 块存储的分类
- 李沐亚马逊资深首席科学家 - 动手学深度学习v2 -2安装
- java 装饰者模式 替代方案_如何利用装饰者模式在不改变原有对象的基础上扩展功能...
- 代码修改及模型复查 12-6
- 计算机windows8黑屏怎么办,详解笔记本电脑出现电源拔出就黑屏的win8处理教程
- html5绘制警告牌,2.10 创建自定义图形:绘制扑克牌花色 - HTML5 Canvas 实战
- python3.6下载opencv_ubuntu16.04+anaconda3+python3.6安装OpenCV3
- 常见查找算法之—二分查找
- 在linux服务器上安装sublime编辑器