不可见索引和虚拟索引。(四)

2014-11-24 17:08:09 · 作者: · 浏览: 2
见索引而不是虚拟索引。

在此设计到一个参数那就是:_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