索引类型之虚拟索引
来源:互联网 发布:淘宝店铺怎么升星 编辑:程序博客网 时间:2024/05/22 03:30
使用场景:
如果想创建一个非常大的索引,并且不分配空间,以便确定优化器能否会用到它;当处理大表时,并要迅速弄清楚优化器是否将使用该表上的一个潜在索引时,我们可以使用虚拟索引,这样开发人员就可以如同该索引实际存在那么运行解释计划,而不必等待一个大的索引被创建完成。如果确定该索引有用,再删除该索引并使用不带nosegment子句的命令重新创建它。
先不分配空间:
SQL> create index fake_idx on employees(last_name) nosegment;
Index created.
Index created.
SQL> select index_name,column_name,table_name
from dba_ind_columns
where index_name like 'FAKE%';
INDEX_NAME COLUMN_NAME TABLE_NAME
------------ ------------------ -----------------
FAKE_IDX LAST_NAME EMPLOYEES
where index_name like 'FAKE%';
INDEX_NAME COLUMN_NAME TABLE_NAME
------------ ------------------ -----------------
FAKE_IDX LAST_NAME EMPLOYEES
SQL> select index_name,table_name from dba_indexes
2* where index_name like 'FAKE%'
SQL> /
no rows selected
2* where index_name like 'FAKE%'
SQL> /
no rows selected
此查询不返回任何行的原因是,dba_indexes视图只显示有实际索引段的信息,因为虚拟索引并没有真正使用存储空间,所以不会显示在这个视图中。
可以通过隐式参数开启:
alter session set "_use_nosegment_indexes"=true;
使用这个参数来检查查询的执行计划,看它是否将使用该索引。
SQL> create index virtual_idx
2 on emp(ename) nosegment;
Index created.
SQL> set autotrace on explain
SQL> alter session set "_use_nosegment_indexes"=true
SQL> /
Session altered.
SQL> select ename from emp where ename='KING';
ENAME
----------
KING
Execution Plan
----------------------------------------------------------
Plan hash value: 1165707112
-------------------------------------------------------------------------------- ------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
2 on emp(ename) nosegment;
Index created.
SQL> set autotrace on explain
SQL> alter session set "_use_nosegment_indexes"=true
SQL> /
Session altered.
SQL> select ename from emp where ename='KING';
ENAME
----------
KING
Execution Plan
----------------------------------------------------------
Plan hash value: 1165707112
-------------------------------------------------------------------------------- ------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 5 | 2 (0)| 00:00:01 |
| 0 | SELECT STATEMENT | | 1 | 5 | 2 (0)| 00:00:01 |
|* 1 | INDEX RANGE SCAN| VIRTUAL_IDX | 1 | 5 | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("ENAME"='KING')
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("ENAME"='KING')
使用索引,看是否有用,如果有用,再drop index, 去掉nosegment,重建。
SQL> drop index virtual_idx;
Index dropped.
Index dropped.
即使在某列上创建了虚拟索引,在同一列上还是可以创建普通索引。
优化器对虚拟索引使用基本默认优惠券统计信息,这与没有收集任何统计信息的正常索引是一样的。
- 索引类型之虚拟索引
- 索引类型之虚拟列
- Oracle之虚拟索引
- Mysql之索引类型
- 虚拟索引
- 虚拟索引
- 虚拟索引
- Mysql索引与优化 之索引类型
- Mysql优化之索引类型
- mysql 索引 & 索引类型
- mysql 索引 & 索引类型
- 数据库 索引&索引类型
- 索引及索引类型
- 索引类型
- 索引类型
- 索引类型
- 索引类型
- 索引类型
- hdu 2063 过山车
- javascript对象小探之五—— void()方法
- 广搜poj.3009
- 编译原理初识
- 如何在 WebDriver 中实现日志记录
- 索引类型之虚拟索引
- 约瑟夫环
- 【书评】《循序渐进DB2:DBA系统管理、运维与应用案例》
- 新建SDI 关闭它自带的面板之后 在运行就没有了的解决方案
- 一起学WF3.5【12】
- 你的代码写的很烂
- 负数的除法和取模运算规则
- java接口和抽象类
- hdu 2444 The Accomodation of Students