深入理解Oracle索引(1):INDEX SKIP SCAN 和 INDEX RANGE SCAN
㈠ Index SKIP SCAN 当表有一个复合索引,而在查询中有除了索引中第一列的其他列作为条件,并且优化器模式为CBO,这时候查询计划就有可能使用到SS Skip scan会探测出索引前导列的唯一值个数,每个唯一值都会作为常规扫描的入口,在此基础上做一次查找,最后合并这些查询 例如:表employees (sex, employee_id, address) ,有一个组合索引(sex, employee_id). 在索引跳跃的情况下,我们可以逻辑上把他们看成两个索引: 一个是(男,employee_id),一个是(女,employee_id). select * from employees where employee_id=1; 发出这个查询后,oracle先进入sex为男的入口,查找employee_id=1的条目。再进入sex为女的入口,查找employee_id=1的条目。最后合并两个结果集 ORACLE官方说,在前导列唯一值较少的情况下,才会用到index skip can。这个其实好理解,就是入口要少,这也是skip scan的条件 ORACLE也承认skip scan没有直接索引查询快,但可以这样说,相比于整个表扫描(table scan),索引跳跃式扫描的速度要快得多 在Oracle9i版本之前,当SQL查询中包含sex和employee_id时,或者查询指定sex的时候才可以使用这一索引,下面的查询就不能使用索引: select employee_id from employees where employee_id=7788; Oracle9i的索引跳跃式扫描执行规则允许使用连接索引,即使SQL查询中不指定性别 这一特性使得无需在employee_id行中提供第二个索引 索引跳跃式扫描适用于硬盘空间和存储空间相当紧缺的情况 因为一个索引可以满足两个查询条件的使用,比单独建两个索引自然节约了空间
例如:
- hr@ORCL> desc t
- Name Null? Type
- ----------------------------------------------------- -------- ------------------------------------
- EMPNO NOT NULL NUMBER
- SEX NOT NULL VARCHAR2(4)
- ENAME VARCHAR2(4)
- hr@ORCL> create index sex_empno on t (sex,empno);
- Index created.
- hr@ORCL> analyze index sex_empno compute statistics;
- Index analyzed.
- hr@ORCL> select /*+ index_ss(t) */ empno from t where empno=8;
- Execution Plan
- ----------------------------------------------------------
- Plan hash value: 3008009344
- ------------------------------------------------------------------------------
- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
- ------------------------------------------------------------------------------
- | 0 | SELECT STATEMENT | | 1 | 10 | 3 (0)| 00:00:01 |
- |* 1 | INDEX SKIP SCAN | SEX_EMPNO | 1 | 10 | 3 (0)| 00:00:01 |
- ------------------------------------------------------------------------------
先看个图:

假如我现在要查找employee_id是109的记录,从图可以看出来,109的记录存在与块3和块5上 但是skip scan是通过什么样的方式定位到这两个块呢? ORACLE可以在SKIP SCAN中,选择相应的入口后,通过根节点和分支节点的信息,非常精准的定位到记录的叶子块,即块3和块5. 如果要查找employee_id为109的条目,ORACLE进入到入口M后,直接就可以定位到块3.而不需要扫描块1和块2. 进入到入口F后,直接就可以定位到块5,而不需要扫描块4和块6 那么,我们上面这条查询,经过skip scan后,内部可能是: select empno from t where sex='M' and empno=8 union select empno from t where sex='F' and empno=8; 我们可以想象,如果索引前导列的唯一值很多,那么势必会大大削弱skip scan的效能,因为可能存在很多union 有时候为了避免index skip scan,建立新的索引是有必要的 ㈡ INDEX Range Scan INDEX Range SCAN是一种很常见的表访问方式 在INDEX Range SCAN中,Oracle访问毗邻的索引条目,然后根据索引里面的rowid去检索表的记录 例如:查询范围为80号部门里的所有员工
- hr@ORCL> select JOB_ID,FIRST_NAME from employees where DEPARTMENT_ID=80;
- Execution Plan
- ----------------------------------------------------------
- Plan hash value: 2056577954
- -------------------------------------------------------------------------------------------------
- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
- -------------------------------------------------------------------------------------------------
- | 0 | SELECT STATEMENT | | 34 | 646 | 4 (0)| 00:00:01 |
- | 1 | TABLE ACCESS BY INDEX ROWID| EMPLOYEES | 34 | 646 | 4 (0)| 00:00:01 |
- |* 2 | INDEX RANGE SCAN | EMP_DEPARTMENT_IX | 34 | | 1 (0)| 00:00:01 |
- -------------------------------------------------------------------------------------------------
INDEX RANGE SCAN是范围扫描,举个例子,有1到100,分5个范围,要查询45就要到第3的范围里查,这样会很快 Index Unique Scan和Index Range Scan在B Tree上的搜索路径是一样的 只是Index Unique Scan在找到应该含有要找的Index Key的block后便停止了搜索,因为该键是唯一的 而Index Range Scan还要循着指针继续找下去直到条件不满足时 并且,Index Range Scan只是索引上的查询,与是否扫描表没有关系 如果所选择的列都在index上就不用去scan table 如果扫描到表, 必然还有一个table access by rowid,正如上例所展示的 通过index range scan访问的表可以通过按照索引顺序重新建立表来提高效率 原因有二: ① 如果你只读一部分数据,假设20% ,如果表数据顺序混乱,实际上可能把整个表都读进来了 如果表顺序和索引一致,则只需要读进 20%的表的block就够了。这是简单情况 ② 复杂情况下,顺序混乱的时候 block 可能在整个查询的不同时间点多次反复访问 当再次要访问这个块的时候说不定已经被换出去了,或者被修改过了,那代价更大 而如果顺序一样,对同一个block的访问集中在一段连续的很短的时间内,变数少,不会对同一个block产生多次IO
深入理解Oracle索引(1):INDEX SKIP SCAN 和 INDEX RANGE SCAN的更多相关文章
- 深入理解Oracle索引(25):一招鲜、吃遍天之单字段索引创建思路
本文较短.不过实用性很好.还是记录之. ㈠ 先别看SQL语句.看执行计划.挑出走全表扫的表 ㈡ 回头看SQL语句.分析上述表的约束字段有哪些.检查各个约束字段的索引是否存在 ㈢ 选择 ...
- Index Skip Scan in Oracle in 11g
http://viralpatel.net/blogs/oracle-index-skip-scan/ in 11g the same sql use index skip scan but in 1 ...
- Oracle索引梳理系列(八)- 索引扫描类型及分析(高效索引必备知识)
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
- Oracle 索引扫描的五种类型
之前在讨论CBO和RBO的时候提到了索引扫描的几种类型. Oracle Optimizer CBO RBO http://blog.csdn.net/tianlesoftware/archive/20 ...
- 关于oracle 索引,收藏
该篇文章很好,,收藏了.. https://www.cnblogs.com/liangyihui/p/5886619.html oracle 索引建立: create bitmap/UNIQUE i ...
- SQLSERVER中的ALLOCATION SCAN和RANGE SCAN
SQLSERVER中的ALLOCATION SCAN和RANGE SCAN 写这篇文章的开始,我还不知道ALLOCATION SCAN的工作原理是怎样的,网上资料少得可怜 求助了园子里的某位大侠,他看 ...
- 索引跳跃式扫描(INDEX SKIP SCAN)
索引跳跃式扫描(INDEX SKIP SCAN) 索引跳跃式扫描(INDEX SKIP SCAN)适用于所有类型的复合B树索引(包括唯一性索引和非唯一性索引),它使那些在where条件中没有对目标索引 ...
- oralce索引中INDEX SKIP SCAN 和 INDEX RANGE SCAN区别
INDEX SKIP SCAN 当表中建立有复合索引的时候,查询时,除复合索引第一列外,别的列作为条件时,且优化器模式为CBO,这个时候查询可能会用到INDEX SKIP SCAN skip scan ...
- 【每日一摩斯】-Index Skip Scan Feature (212391.1)
INDEX Skip Scan,也就是索引快速扫描,一般是指谓词中不带复合索引第一列,但扫描索引块要快于扫描表的数据块,此时CBO会选择INDEX SS的方式. 官方讲的,这个概念也好理解,如果将复合 ...
随机推荐
- 第5章分布式系统模式 使用服务器激活对象通过 .NET Remoting 实现 Broker
正在使用 Microsoft? .NET Framework 构建一个需要使用分布式对象的应用程序.您的要求包括能够按值或按引用来传递对象,无论这些对象驻留在同一台计算机上,还是驻留在同一个局域网 ( ...
- GCC编译步骤
gcc -E t1.c -o t1.i 预处理gcc -S t1.i -o t1.s 转成汇编语言gcc -c t1.s -o t1.o 转成机器码gcc t1.o -o t1.exe 链接 直接使用 ...
- ibatis设置启用及关闭命名空间
使ibatis用命名空间能够有效避免sql配置命名冲突,默认为启用状态,可以通过settings标签设置为关闭状态,例如: <settings> <setting name=&quo ...
- R 连接DB2数据库,并制作词图
#写在前面的话:此教程主要是用R连接了DB2数据库,并进行文本分析,制作了词图 #教程为markdown编写 ---title: "网站留言分析"output: html_docu ...
- AI:机器人与关键技术--总是被科普
AI:机器人与关键技术--总是被科普 原文链接:www.csdn.net/article/2014-04-22/2819430 机器人发展建议: 有需求才有生产,有更高的需求才有发展: 第一条:我们的 ...
- 知识工程.Vs.软件构架,框架,设计模式.
软件工程-原文链接:http://tech.it168.com/a2009/0902/672/000000672853.shtml 此文章详细给出了软件设计的基本概念和用途,文章链接:http://w ...
- 开发一个 App 有多难?说出来你可能不信!
上图为程序员客栈儿童类视频APP 1.开发一个APP有多难?说实话,单纯地从开发来说,开发一个APP没有那么难.如果一款APP的基本功能点确定了,开发时间一般为1-2个月就完成了,费用大约5-10万的 ...
- (转)基于MVC4+EasyUI的Web开发框架形成之旅--基类控制器CRUD的操作
http://www.cnblogs.com/wuhuacong/p/3352016.html 在上一篇随笔中,我对Web开发框架的总体界面进行了介绍,其中并提到了我的<Web开发框架>的 ...
- MongoDB_"Error parsing YAML config file: yaml-cpp: error at line 3, column 9: illegal map value"解决方法
在启动配置文件的时候,系统报错:Error parsing YAML config file: yaml-cpp: error at line 3, column 9: illegal map val ...
- javascript (BOM DOM)
BOM对象 window对象 所有浏览器都支持 window 对象.概念上讲.一个html文档对应一个window对象.功能上讲: 控制浏览器窗口的.使用上讲: window对象不需要创建对象,直接使 ...