索引范围扫描(INDEX RANGE SCAN)

      索引范围扫描(INDEX RANGE SCAN)适用于所有类型的B树索引,当扫描的对象是唯一性索引时,此时目标SQL的where条件一定是范围查询(谓词条件为 BETWEEN、<、>等);当扫描的对象是非唯一性索引时,对目标SQL的where条件没有限制(可以是等值查询,也可以是范围查询)。 索引范围扫描的结果可能会返回多条记录,其实这就是索引范围扫描中"范围"二字的本质含义。

测试一:唯一索引的范围查询

SCOTT@PDBORCL> select * from emp where empno>7369;

已选择 13 行。

执行计划
----------------------------------------------------------
Plan hash value: 2787773736

----------------------------------------------------------------------------------------------
| Id  | Operation                           | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |        |    13 |   494 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID BATCHED| EMP    |    13 |   494 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN                  | PK_EMP |    13 |       |     1   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("EMPNO">7369)

统计信息
----------------------------------------------------------
         54  recursive calls
          0  db block gets
         97  consistent gets
         21  physical reads
          0  redo size
       1607  bytes sent via SQL*Net to client
        544  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          8  sorts (memory)
          0  sorts (disk)
         13  rows processed

SCOTT@PDBORCL>

测试二:非唯一索引的等值查询

创建一个测试表EMP_TEMP:

create table emp_temp as select * from emp;

然后在表EMP_TEMP的列EMPNO上创建一个单键值非唯一性同名B树索引IDX_EMP_TEMP:

create index idx_emp_temp on emp_temp(empno);

最后我们再次执行如下SQL:

select * from emp_temp where empno=7369;

执行计划如下:

SCOTT@PDBORCL> create table emp_temp as select * from emp;

表已创建。

SCOTT@PDBORCL> create index idx_emp_temp on emp_temp(empno);

索引已创建。

SCOTT@PDBORCL> select * from emp_temp where empno=7369;

执行计划
----------------------------------------------------------
Plan hash value: 1638992559

----------------------------------------------------------------------------------------------------
| Id  | Operation                           | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |              |     1 |    38 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID BATCHED| EMP_TEMP     |     1 |    38 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN                  | IDX_EMP_TEMP |     1 |       |     1   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("EMPNO"=7369)

统计信息
----------------------------------------------------------
         46  recursive calls
          0  db block gets
         76  consistent gets
         16  physical reads
          0  redo size
       1042  bytes sent via SQL*Net to client
        544  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          6  sorts (memory)
          0  sorts (disk)
          1  rows processed

SCOTT@PDBORCL>

此SQL的执行计划已经从之前的索引唯一性扫描变为现在的索引范围扫描

测试三:非唯一索引的范围查询

同样是测试二中的表EMP_TEMP

SCOTT@PDBORCL> select * from emp_temp where empno>7369;

执行计划如下:

SCOTT@PDBORCL> select * from emp_temp where empno>7369;

已选择 13 行。

执行计划
----------------------------------------------------------
Plan hash value: 1638992559

----------------------------------------------------------------------------------------------------
| Id  | Operation                           | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |              |    13 |   494 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID BATCHED| EMP_TEMP     |    13 |   494 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN                  | IDX_EMP_TEMP |    13 |       |     1   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("EMPNO">7369)

统计信息
----------------------------------------------------------
         46  recursive calls
          0  db block gets
         77  consistent gets
         15  physical reads
          0  redo size
       1607  bytes sent via SQL*Net to client
        544  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          6  sorts (memory)
          0  sorts (disk)
         13  rows processed

SCOTT@PDBORCL>

时间: 2024-08-02 07:01:32

索引范围扫描(INDEX RANGE SCAN)的相关文章

索引唯一性扫描(INDEX UNIQUE SCAN)

       索引唯一性扫描(INDEX UNIQUE SCAN)是针对唯一性索引(UNIQUE INDEX)的扫描,它仅仅适用于where条件里是等值查询的目标SQL.因为扫描的对象是唯一性索引,所以索引唯一性扫描的结果至多只会返回一条记录. Emp表中empno为primary key,对应一个unique index [email protected]> select * from emp where empno=7369; 执行计划 ---------------------------

索引快速扫描(index fast full scan)

一.索引快速扫描(index fast full scan) 索引快速全扫描(INDEX FAST FULL SCAN)和索引全扫描(INDEX  FULL SCAN)极为类似,它也适用于所有类型的B树索引(包括唯一性索引和非唯一性索引).和索引全扫描一样,索引快速全扫描也需要扫描目标索引所有叶子块的所有索引行. 索引快速全扫描与索引全扫描相比有如下三点区别. (1)索引快速全扫描只适用于CBO. (2)索引快速全扫描可以使用多块读,也可以并行执行. (3)索引快速全扫描的执行结果不一定是有序的

CBO之B*Tree Index Range Scan - IRS算法

转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/44262353 ************************************************************  二.CBO之B*Tree Index Range Scan - IRS算法************************************************************* 1.在表gyj_t1建索引 SQL> create i

利用虚拟索引(Virtual Index)优化数据库的案例分析

当我们在对生产库做优化的时候,主要就是对SQL语句的优化,包括语句的等价改写等,但其中很大一部分情况,又与索引有关.如果能合理利用合适的索引,可以使原本走全表扫描产生的逻辑读大大降低,提高数据库的性能.由于Oracle数据库中的索引本身就要占用磁盘空间,维护索引需要一定的开销,如何才能知道创建某个索引,会给数据带来性能的提升,而又不至于判断失误,创建了一个不恰当的索引,最后又不得不删除呢?这种情况下,我们可以利用Oralce提供的虚拟索引,即nosegment索引,它并不占用磁盘资源,只是在数据

位图索引(Bitmap Index)——索引共用

位图索引区别于传统B*树索引有两个结构特点:其一是叶子节点上是一个可能的索引列取值对应一个叶子节点.另一个就是叶子节点上通过一个位图向量表示对应行是否取定这个索引值. 使用位图向量记录对应行的取值情况不仅可以带来存储空间上的节省,而且可以借助计算机位图运算的快速特性来提高索引结果利用率.下面我们通过模拟情况来进行分析. Bitmap Index模拟说明 假设存在数据表T,有两个数据列A和B,取值如下. 序号 A B 1 L 1 2 T 2 3 L 2 4 M 1 对两个数据列A.B分别建立位图索

索引全扫描(INDEX FULL SCAN)

所谓的索引全扫描(INDEX FULL SCAN)就是指要扫描目标索引所有叶子块的所有索引行.这里需要注意的是,索引全扫描需要扫描目标索引的所有叶子块,但这并不意味着需要扫描该索引的所有分支块.在默认情况下,Oracle在做索引全扫描时只需要通过访问必要的分支块定位到位于该索引最左边的叶子块的第一行索引行,就可以利用该索引叶子块之间的双向指针链表,从左至右依次顺序扫描该索引所有叶子块的所有索引行了. 例子一:查询的列有唯一索引,使用索引全扫描(INDEX FULL SCAN) 执行如下SQL:

Index Full Scan vs Index Fast Full Scan-1103

[Oracle] Index Full Scan vs Index Fast Full Scan作者:汪海 (Wanghai) 日期:14-Aug-2005 出处:http://spaces.msn.com/members/wzwanghai/ --------------------------------------------------------------------------------Index Full Scan vs Index Fast Full Scan index f

INDEX SKIP SCAN适用场景

--请记住这个INDEX SKIP SCAN扫描方式 drop table t purge;create table t as select * from dba_objects;update t set object_type='TABLE' ;commit;update t set object_type='VIEW' where rownum<=30000;commit;create  index idx_type_id on t(object_type,object_id);exec d

oracle中索引快速全扫描和索引全扫描的区别

当进行index full scan的时候 oracle定位到索引的root block,然后到branch block(如果有的话),再定位到第一个leaf block, 然后根据leaf block的双向链表顺序读取.它所读取的块都是有顺序的,也是经过排序的.而index fast full scan则不同,它是从段头开始,读取包含位图块,root block, 所有的branch block, leaf block,读取的顺序完全由物理存储位置决定,并采取多块读,每次读取db_file_m