Oracle的虚拟索引允许在不创建真实索引的情况下来测试添加索引对查询是否有帮助,测试如下:
1先看初始执行计划
SQL> EXPLAIN PLAN FOR SELECT * FROM BI.ODS_PMSETTLE WHERE ID=1300;
已解释。
SQL> SET LINESIZE 130
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY(null,null,'BASIC +COST'));
Plan hash value: 4246244671
-------------------------------------------------------
| Id | Operation | Name | Cost (%CPU)|
-------------------------------------------------------
| 0 | SELECT STATEMENT | | 11 (0)|
| 1 | TABLE ACCESS FULL| ODS_PMSETTLE | 11 (0)|
-------------------------------------------------------
已选择8行。
2允许session使用虚拟索引,默认false
SQL> alter session set "_use_nosegment_indexes"=true;
会话已更改。
3添加虚拟索引,使用nosegment选项
SQL> create index v_idx_pmsettle_id on bi.ods_pmsettle(id) nosegment;
索引已创建。
4再次运行执行计划
SQL> EXPLAIN PLAN FOR SELECT * FROM BI.ODS_PMSETTLE WHERE ID=1300;
已解释。
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY(null,null,'BASIC +COST'));
Plan hash value: 134430619
----------------------------------------------------------------------
| Id | Operation | Name | Cost (%CPU)|
----------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 2 (0)|
| 1 | TABLE ACCESS BY INDEX ROWID| ODS_PMSETTLE | 2 (0)|
| 2 | INDEX RANGE SCAN | V_IDX_PMSETTLE_ID | 1 (0)|
----------------------------------------------------------------------
已选择9行。
SQL>