Oracle 索引扫描的几种类型

index range scan(索引范围扫描):

1.对于unique index来说,如果where 条件后面出现了<,> ,between ...and...的时候,那么就可能执行index range scan,如果where条件后面是=,那么就会执行index unique scan。

2.对于none unique index来说 如果where 条件后面出现了=,>,<,betweed...and...的时候,就有可能执行index range scan。

3.对于组合索引来说,如果where条件后面出现了组合索引的引导列,那么可能执行index range scan。

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

如果select 语句后面中的列都被包含在组合索引中,而且where后面没有出现组合索引的引导列,并且需要检索出大部分数据,那么这个时候可能执行index fast full scan。index fast full scan 发生的条件:

1.必须是组合索引  ?。2.引导列不在where条件中

index skip scan(索引跳跃式扫描)

当查询可以通过组合索引得到结果,而且返回结果很少,并且where条件中没有包含索引引导列的时候,可能执行index skip scan

索引跳跃式扫描发生的条件:

1.必须是组合索引。

2.引导列没有出现在where条件中

-eg1

SQL> create table test as select * from dba_objects;

Table created.

SQL> create unique index ind_id on test(object_id);

Index created.

SQL> create index ind_owner on test(owner);

Index created.

SQL> create index ooo on test(owner,object_name,object_type);

Index created.

SQL> exec dbms_stats.gather_table_stats('SCOTT','TEST');

PL/SQL procedure successfully completed.

SQL> set autot trace


SQL> select owner from test where object_id=10;


Execution Plan
----------------------------------------------------------
Plan hash value: 2544773305

--------------------------------------------------------------------------------
------

| Id  | Operation            | Name  | Rows  | Bytes | Cost (%CPU)| Time
    |

--------------------------------------------------------------------------------
------

|  0 | SELECT STATEMENT        |        |      1 |      11 |      2  (0)| 00:0
0:01 |

|  1 |  TABLE ACCESS BY INDEX ROWID| TEST  |      1 |      11 |      2  (0)| 00:0
0:01 |

|*  2 |  INDEX UNIQUE SCAN        | IND_ID |      1 |        |      1  (0)| 00:0
0:01 |

--------------------------------------------------------------------------------
------


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

2 - access("OBJECT_ID"=10)


Statistics
----------------------------------------------------------
      0  recursive calls
      0  db block gets
      3  consistent gets
      0  physical reads
      0  redo size
    524  bytes sent via SQL*Net to client
    524  bytes received via SQL*Net from client
      2  SQL*Net roundtrips to/from client
      0  sorts (memory)
      0  sorts (disk)
      1  rows processed

SQL> select owner from test where object_id<10;

8 rows selected.


Execution Plan
----------------------------------------------------------
Plan hash value: 1361604213

--------------------------------------------------------------------------------
------

| Id  | Operation            | Name  | Rows  | Bytes | Cost (%CPU)| Time
    |

--------------------------------------------------------------------------------
------

|  0 | SELECT STATEMENT        |        |      8 |      88 |      3  (0)| 00:0
0:01 |

|  1 |  TABLE ACCESS BY INDEX ROWID| TEST  |      8 |      88 |      3  (0)| 00:0
0:01 |

|*  2 |  INDEX RANGE SCAN        | IND_ID |      8 |        |      2  (0)| 00:0
0:01 |

--------------------------------------------------------------------------------
------


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

2 - access("OBJECT_ID"<10)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/fe5b1276093beaf0f6869b4a23bf05b3.html