Oracle索引扫描的4种类型(三)

2014-11-24 11:49:13 · 作者: · 浏览: 3
14K| 1451K| 74 (0)| 00:00:01
| 1 | INDEX FAST FULL SCAN| INDEX_T3 | 114K| 1451K| 74 (0)| 00:00:01
--------------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement (level=2)
统计信息
----------------------------------------------------------
19 recursive calls
0 db block gets
7931 consistent gets
253 physical reads
0 redo size
1663703 bytes sent via SQL*Net to client
84126 bytes received via SQL*Net from client
7612 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
114164 rows processed
index full scan的时候oracle定位到索引的root block,然后到branch block(如果有的话),再定位到第一个leaf block, 然后根据leaf block的双向链表顺序读取。它所读取的块都是有顺序的,也是经过排序的。
index fast full scan则不同,它是从段头开始,读取包含位图块,root block,所有的branch block, leaf block,读取的顺序完全有物理存储位置决定,并采取多块读,每次读取db_file_multiblock_read_count个块。
使用这两种索引扫描需要表的索引字段至少有一个是not null限制。快速全索引扫描比普通索引扫描速度快是因为快速索引扫描能够多块读取,并且能并行处理。
四. 索引跳跃扫描(INDEX SKIP SCAN)
索引跳跃扫描主要发生在对复合索引的列进行过滤时,没有写上先导列,并且先导列中的重复值较多,而非先导列中的重复数据较少。
SQL> create table t5 as select t.*,rownum id from user_tables t;
表已创建。
SQL> create index index_t5 on t5(table_name,id) ;
索引已创建。
SQL> begin
2 dbms_stats.gather_table_stats(ownname =>'BOC_RWA3' ,tabname => 'T5' );
3 end;
4 /
PL/SQL 过程已成功完成。
当在where 条件中出现前导列时为INDEX RANGE SCAN
select * from t5 t where table_name = 'T1';
执行计划
----------------------------------------------------------
Plan hash value: 1915796132
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Ti
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 214 | 3 (0)| 00
| 1 | TABLE ACCESS BY INDEX ROWID| T5 | 1 | 214 | 3 (0)| 00
|* 2 | INDEX RANGE SCAN | INDEX_T5 | 1 | | 2 (0)| 00
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("TABLE_NAME"='T1')
统计信息
----------------------------------------------------------
1 recursive calls
0 db block gets
4 consistent gets
0 physical reads
0 redo size
4144 bytes sent via SQL*Net to client
416 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
当在where 条件中出现非前导列时为INDEX SKIP SCAN
SQL> select * from t5 t where id = 10;
执行计划
----------------------------------------------------------
Plan hash value: 2396816619
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Ti
--------------------------------------------------------------------------------
| 0 | SELE