在此设计到一个参数那就是:_use_nosegment_indexes ,注意该参数并不是意味着数据库就要使用虚拟索引,而是代表该索引在优化器中是否使用其在执行计划内:
SQL> set feedback off SQL> @getsp.sql Enter value for par: _use_nosegment KSPPINM KSPPSTVL KSPPDESC -------------------------------------------------- -------------------- ------------------------------------------------------------ _use_nosegment_indexes FALSE use nosegment indexes in explain plan SQL>
创建虚拟索引:
SQL> create index emp_nosegment_idx1 on emp(deptno) nosegment; SQL> select index_name,index_type,table_name from user_indexes where table_name='EMP'; INDEX_NAME INDEX_TYPE TABLE_NAME ------------------------------ --------------------------- ------------------------------ EMP_IDX1 NORMAL EMP SQL> create index emp_nosegment_idx1 on emp(deptno) nosegment; SQL> select index_name,index_type,table_name from user_indexes where table_name='EMP'; INDEX_NAME INDEX_TYPE TABLE_NAME ------------------------------ --------------------------- ------------------------------ EMP_IDX1 NORMAL EMP
有一点可以看到,在创建虚拟索引的时候,oracle并没有提示索引是否创建成功(嘿嘿。。哈哈)?第二,在查询user_indexes视图中并没有显示该虚拟索引的信息?
这是因为dba_indexes是显示的真实有存储信息的索引信息。
SQL> COL COLUMN_NAME FOR A30 SQL> R 1* select index_name,column_name from user_ind_columns where table_name='EMP' INDEX_NAME COLUMN_NAME ------------------------------ ------------------------------ EMP_IDX1 EMPNO EMP_NOSEGMENT_IDX1 DEPTNO SQL>
如何使用虚拟索引,就是通过在session和system level调节_use_nosegment_indexes。
eg:
SQL> alter session set "_use_nosegment_indexes"=true;
SQL> select empno from emp where empno=7369;
Execution Plan
----------------------------------------------------------
Plan hash value: 3309675936
---------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 3 | 2 (0)| 00:00:01 |
|* 1 | INDEX RANGE SCAN| EMP_NOSEGMENT_IDX1 | 1 | 3 | 2 (0)| 00:00:01 |
---------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("EMPNO"=7369)
SQL> alter session set "_use_nosegment_indexes"=false;
SQL> select empno from emp where empno=7369;
Execution Plan
----------------------------------------------------------
Plan hash value: 3956160932
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 3 | 6 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| EMP | 1 | 3 | 6 (0)| 00:00:01 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("EMPNO"=7369)
SQL> alter session set "_use_nosegment_indexes"=true;
SQL> select * from emp where empno=7369;
Execution Plan
----------------------------------------------------------
Plan hash value