㈠ 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行中提供第二个索引        索引跳跃式扫描适用于硬盘空间和存储空间相当紧缺的情况        因为一个索引可以满足两个查询条件的使用,比单独建两个索引自然节约了空间

例如:

  1. hr@ORCL> desc t
  2. Name                                                  Null?    Type
  3. ----------------------------------------------------- -------- ------------------------------------
  4. EMPNO                                                 NOT NULL NUMBER
  5. SEX                                                   NOT NULL VARCHAR2(4)
  6. ENAME                                                          VARCHAR2(4)
  7. hr@ORCL> create index sex_empno on t (sex,empno);
  8. Index created.
  9. hr@ORCL> analyze index sex_empno compute statistics;
  10. Index analyzed.
  11. hr@ORCL> select /*+ index_ss(t) */ empno from t where empno=8;
  12. Execution Plan
  13. ----------------------------------------------------------
  14. Plan hash value: 3008009344
  15. ------------------------------------------------------------------------------
  16. | Id  | Operation        | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
  17. ------------------------------------------------------------------------------
  18. |   0 | SELECT STATEMENT |           |     1 |    10 |     3   (0)| 00:00:01 |
  19. |*  1 |  INDEX SKIP SCAN | SEX_EMPNO |     1 |    10 |     3   (0)| 00:00:01 |
  20. ------------------------------------------------------------------------------

先看个图:

假如我现在要查找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号部门里的所有员工

  1. hr@ORCL> select JOB_ID,FIRST_NAME from employees where DEPARTMENT_ID=80;
  2. Execution Plan
  3. ----------------------------------------------------------
  4. Plan hash value: 2056577954
  5. -------------------------------------------------------------------------------------------------
  6. | Id  | Operation                   | Name              | Rows  | Bytes | Cost (%CPU)| Time     |
  7. -------------------------------------------------------------------------------------------------
  8. |   0 | SELECT STATEMENT            |                   |    34 |   646 |     4   (0)| 00:00:01 |
  9. |   1 |  TABLE ACCESS BY INDEX ROWID| EMPLOYEES         |    34 |   646 |     4   (0)| 00:00:01 |
  10. |*  2 |   INDEX RANGE SCAN          | EMP_DEPARTMENT_IX |    34 |       |     1   (0)| 00:00:01 |
  11. -------------------------------------------------------------------------------------------------

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的更多相关文章

  1. 深入理解Oracle索引(25):一招鲜、吃遍天之单字段索引创建思路

    本文较短.不过实用性很好.还是记录之.          ㈠ 先别看SQL语句.看执行计划.挑出走全表扫的表 ㈡ 回头看SQL语句.分析上述表的约束字段有哪些.检查各个约束字段的索引是否存在 ㈢ 选择 ...

  2. 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 ...

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

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

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

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

  5. 关于oracle 索引,收藏

    该篇文章很好,,收藏了.. https://www.cnblogs.com/liangyihui/p/5886619.html oracle 索引建立: create  bitmap/UNIQUE i ...

  6. SQLSERVER中的ALLOCATION SCAN和RANGE SCAN

    SQLSERVER中的ALLOCATION SCAN和RANGE SCAN 写这篇文章的开始,我还不知道ALLOCATION SCAN的工作原理是怎样的,网上资料少得可怜 求助了园子里的某位大侠,他看 ...

  7. 索引跳跃式扫描(INDEX SKIP SCAN)

    索引跳跃式扫描(INDEX SKIP SCAN) 索引跳跃式扫描(INDEX SKIP SCAN)适用于所有类型的复合B树索引(包括唯一性索引和非唯一性索引),它使那些在where条件中没有对目标索引 ...

  8. oralce索引中INDEX SKIP SCAN 和 INDEX RANGE SCAN区别

    INDEX SKIP SCAN 当表中建立有复合索引的时候,查询时,除复合索引第一列外,别的列作为条件时,且优化器模式为CBO,这个时候查询可能会用到INDEX SKIP SCAN skip scan ...

  9. 【每日一摩斯】-Index Skip Scan Feature (212391.1)

    INDEX Skip Scan,也就是索引快速扫描,一般是指谓词中不带复合索引第一列,但扫描索引块要快于扫描表的数据块,此时CBO会选择INDEX SS的方式. 官方讲的,这个概念也好理解,如果将复合 ...

随机推荐

  1. mac安装python3 pandas tushare

    1,升级pip python3 -m pip install --upgrade pip 2,安装依赖包 pip install --user numpy scipy jupyter pandas s ...

  2. ts中类的继承

    定义类 class Person { name: string; //属性 constructor(_name: string) { this.name = _name; } //构造函数 sayHe ...

  3. poj1094Sorting It All Out 拓扑排序

    做拓扑排序的题目,首先要知道两条定理: 1.最后得到的拓扑数组的元素个数如果小于n,则不存在拓扑序列.  (有圈) 2.如果一次入队的入度为零的点数大于1,则拓扑序列不唯一. (关系不确定) 本题有一 ...

  4. 深度讲解智能硬件手机APP开发流程

    常州做APP开发公司紫竹云科技分析,智能硬件产品的软件开发,除了APP和后台之外还有一个固件端的开发,由于固件是要运行产品上的,不过此时的硬件也是刚开始进行研发,所以是无法提供硬件来运行固件的.因此在 ...

  5. textarea 自适应高度

    试了好多方法,包括百度了好多.一旦接口获取的内容,就不好用了.有时候就是脑袋转不过来,想了好久的方法居然那么简单,然后,脑洞大开,忽然想到还可以这样弄, 很简单,两句话 var textareaHei ...

  6. 文件IO详解(四)---标准输入、标准输出和标准错误

    每个进程都会默认打开3个文件描述符,即0.1.2.其中0代表标准输入流.1代表标准输出流.2代表标准错误流.通常标准输入流对应着键盘的设备文件.标准输出流和错误流对应着显示器的设备文件.在编程中通常使 ...

  7. PhotoZoom Pro 7 支持哪些图像格式?

    PhotoZoom是一款新颖的.技术上具有革命性的对数码图片无损放大的工具.为设计工作者提供了优良的解决方案,可快速渲染出完美的放大照片,呈现无与伦比的画质效果.将因其应用的广泛性,所以对图像文件的支 ...

  8. Spring cloud服务的提供者建立

    1.0我们要在这里要建立一个服务的提供者模块,是一个module,类似于服务的公共模块 第一步:添加架包 <project xmlns="http://maven.apache.org ...

  9. bzoj 1207 [HNOI2004]打鼹鼠 小技巧

    Description 鼹鼠是一种很喜欢挖洞的动物,但每过一定的时间,它还是喜欢把头探出到地面上来透透气的.根据这个特点阿Q编写了一个打鼹鼠的游戏:在一个n*n的网格中,在某些时刻鼹鼠会在某一个网格探 ...

  10. qqbot 出现请求接口失败的问题

    解决方法: 找到python安装目录下“Lib\site-packages\qqbot\qcontactdb\fetch.py”文件下的“http://s.web2.qq.com” 替换成 “http ...