首页 > 数据库 > Oracle > Oracle访问索引的执行计划(四)
Oracle访问索引的执行计划(一)
Oracle访问索引的执行计划(二)
Oracle访问索引的执行计划(三)
如果目标表比较大,相关字段上有索引,根据CBO,Oracle可能会使用索引快速全扫描(INDEX FAST FULL SCAN)来扫描索引,提高访问速度。索引快速全扫描使用多块读,可以并行执行,结果是无序的。产生db file scattered reads事件。
创建一个测试表。
SQL> create table objtest as select object_id,object_name from dba_objects;
Table created.
SQL> select count(*) from objtest;
COUNT(*)
----------
87044
创建一个非唯一索引。
SQL> create index idx_objtest_id on objtest(object_id);
Index created.
收集统计信息。
SQL> exec dbms_stats.gather_table_stats('HR','OBJTEST',estimate_percent=>100,cascade=>true);
PL/SQL procedure successfully completed.
获取字段所有非空值。
SQL> select object_id from objtest where object_id is not null;
87043 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 1925724089
---------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 87043 | 425K| 54 (0)| 00:00:01 |
|* 1 | INDEX FAST FULL SCAN| IDX_OBJTEST_ID | 87043 | 425K| 54 (0)| 00:00:01 |
---------------------------------------------------------------------------------------
获取字段某个范围的值。
SQL> select object_id from objtest where object_id between 1 and 80000;
79152 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 1925724089
---------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 77996 | 380K| 55 (2)| 00:00:01 |
|* 1 | INDEX FAST FULL SCAN| IDX_OBJTEST_ID | 77996 | 380K| 55 (2)| 00:00:01 |
---------------------------------------------------------------------------------------
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/28536251/viewspace-2140059/ ,如需转载,请注明出处,否则将追究法律责任。