Oracle索引扫描:先通过index查找到索引的值,并根据索引的值对应的rowid值(对于非唯一索引可能返回多个rowid值)直接从表中得到具体的数据。一个rowid唯一的表示一行数据,该行对应的数据块是通过一次i/o得到的,在此情况下该次i/o只会读取一个数据库块。

在索引中,除了存储每个索引的值外,索引还存储具有此值的行对应的ROWID值。
Oracle索引扫描可以由3步组成:
(1) 扫描索引得到满足条件的索引值。
(2) 根据索引值得到对应的rowid。
(3) 通过找到的rowid从表中读出具体的数据。

每步都是单独的一次I/O,但是对于索引,由于经常使用,绝大多数都已经CACHE到内存中,所以第1、2步的I /O经常是逻辑I/O,即数据可以从内存中得到。但是对于第3步来说,如果表比较大,则其数据不可能全在内存中,所以其I/O很有可能是物理I/O。相对逻辑I/O来说,是极其费时间的。所以如果大表进行索引扫描,取出的数据如果大于总量的5% -- 10%,使用索引扫描会效率下降很多。

SQL> explain plan for select deptno,dname from dept where deptno=10; 
已解释。
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
Plan hash value: 2852011669
---------------------------------------------------------------------------------------
| Id  | Operation                   | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |         |     1 |    13 |     1   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| DEPT    |     1 |    13 |     1   (0)| 00:00:01 |
|*  2 |   INDEX UNIQUE SCAN         | PK_DEPT |     1 |       |     0   (0)| 00:00:01 |
---------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
PLAN_TABLE_OUTPUT
  2 - access("DEPTNO"=10)
已选择14行。

分析:此例中先通过INDEX UNIQUE SCAN(index扫描),找到deptno=10对应的rowid;再根据rowid通过TABLE ACCESS BY INDEX ROWID找到depnot=10的数据。(通过1次i/o得到数据。)

SQL> explain plan for select deptno from dept where deptno=10;  //只查找deptno,而deptno上有索引,所以直接得到
已解释。
SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT

Plan hash value: 3202655801

-----------------------------------------------------------------------------
| Id  | Operation         | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |         |     1 |     3 |     0   (0)| 00:00:01 |
|*  1 |  INDEX UNIQUE SCAN| PK_DEPT |     1 |     3 |     0   (0)| 00:00:01 |
-----------------------------------------------------------------------------
Predicate Information (identified by operation id):
PLAN_TABLE_OUTPUT
 1 - access("DEPTNO"=10)
已选择13行。

分析:此例中因为index里已经存有了deptno,所以直接得到deptno的值。(通过0次i/o得到数据。)

SQL> explain plan for select deptno,dname from dept where deptno>20;
已解释。
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
Plan hash value: 2985873453
---------------------------------------------------------------------------------------
| Id  | Operation                   | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |         |     3 |    39 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| DEPT    |     3 |    39 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | PK_DEPT |     3 |       |     1   (0)| 00:00:01 |
---------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
PLAN_TABLE_OUTPUT
  2 - access("DEPTNO">20)
已选择14行。

SQL> select * from dept;
DEPTNO DNAME          LOC
------ -------------- --------
    10 ACCOUNTING     NEW YORK
    20 RESEARCH       DALLAS
    30 SALES          CHICAGO
    40 OPERATIONS     BOSTON

分析:此例中因为索引是已经排序了的,所以将按照索引的顺序通过INDEX RANGE SCAN(index范围扫描)找到满足条件的2条索引值deptno=30,deptno=40。根据它们对应的rowid找到相应的数据。(通过2次i/o得到所有数据。)

Oracle索引扫描的更多相关文章

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

    根据索引的类型与where限制条件的不同,有4种类型的Oracle索引扫描: 3,4可归一种 (1) 索引唯一扫描(index uniquescan) (2) 索引范围扫描(index range s ...

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

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

  3. Oracle索引扫描算法

    SQL> create table t as select * from dba_objects; Table created. SQL> create index idx_t on t( ...

  4. oracle 索引扫描类型的分类与构造

    1. INDEX RANGE SCAN--请记住这个INDEX RANGE SCAN扫描方式drop table t purge;create table t as select * from dba ...

  5. Oracle 索引扫描的几种情况

    index range scan(索引范围扫描): 1.对于unique index来说,如果where 条件后面出现了<,> ,between ...and...的时候,那么就可能执行i ...

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

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

  7. oracle 基础知识(十四)----索引扫描

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

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

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

  9. 关于ORACLE索引的几种扫描方式

    ------------恢复内容开始------------ ------------恢复内容开始------------ 一条sql执行的效率因执行计划的差异而影响,经常说这条sql走索引了,那条s ...

随机推荐

  1. MySQL(8):数值类型详细分析

    1.日期和时间类型 2.varchar和char 固定长度 (char) 或可变长度 (varchar) 字符数据类型.  例如: a char(10)b varchar(10)都存入'abc'a要求 ...

  2. 学习strcat与strcpy

    前几天刚有点认识了strlen和sizeof,今天又有点认识了strcpy和strcat. 在vc2010环境下 1 strcpy strcpy(p,q),p要么为数组,要么为空指针,要是为空指针操作 ...

  3. css布局模型之绝对定位与相对定位

    1. 绝对定位,absolute 如果想为元素设置层模型中的绝对定位,需要设置position:absolute(表示绝对定位),这条语句的作用将元素从文档流中拖出来,然后使用left.right.t ...

  4. javascript数据结构和算法[转]

    字符串表示的数组 join() 和 toString() 函数返回数组的字符串表示.这两个函数通过将数组中的元素用逗号分隔符分割,返回字符串数组表示. 这里有个例子: var names = [&qu ...

  5. 关于Git的分支

    分支是代码管理的利器.如果没有有效的分支管理.代码管理就适应不了复杂的开发过程和 项目的需要. 分支命令概述: 在Git中分支管理使用命令git branch.该命令的主要用法如下: 用法一: git ...

  6. android的平台架构及特性

    Android平台采用了整合的策略思想,包括底层Linux操作系统.中间层的中间件和上层的Java应用程序.下面我把Android的特性及其架构体系结构总结一下. 一.Android的平台特性 And ...

  7. job interview

    一 , 7series clock 二, SDRAM comtroller (DDR) 4.熟悉DDR2/3协议或Ethernet相关协议,并有实际项目经验者优先: 三,AXI bus(AMBA) 四 ...

  8. SharePoint2013 SharePoint-Hosted 模式 分页方法

    /**分页js插件 var ListPager = new listPaging(); 先调用start方法加载上下文 然后调用dataLoad方法查询第一页数据 需要设置几个属性值 ListPage ...

  9. box-shadow学习笔记

    CSS3 box-shadow属性的简单学习笔记 语法格式: box-shadow: h-shadow v-shadow blur spread color inset; 值 描述 h-shadow ...

  10. 【转载】最近在用Arrays的asList()生成的List时,List元素的个数时而不正确,数组转化为List,即Arrays.asList(intArray);

    最近在用Arrays的asList()生成的List时,List元素的个数时而不正确. Java代码 //经多次测试,只要传递的基本类型的数组,生成List的元素个数均为1 char arrc = { ...