ITPub博客

首页 > 数据库 > Oracle > oracle虚拟索引简介

oracle虚拟索引简介

原创 Oracle 作者:oracle11111 时间:2024-11-08 14:49:46 0 删除 编辑

一、目的与应用场景

虚拟索引的目的是模拟索引的存在而不用真实创建一个完整索引。这允许开发者创建虚拟索引来查看相关执行计划,

而不用等到真实创建完索引后才能查看索引对执行计划的影响。虚拟索引主要应用于SQL优化调优当中,

尤其是给数据库管理员(DBA)在生产环境进行SQL优化时使用。DBA可以根据虚拟索引的测试效果来判断是否需要创建实际索引。


二、创建与验证

创建虚拟索引:

语法:create index index_name on table_name(col_name) nosegment;

示例:create index idx_test_virtual on tt(object_id) nosegment;

注意:在创建虚拟索引时,需要在CREATE INDEX语句中指定nosegment子句。

验证虚拟索引:

创建虚拟索引后,需要设置隐含参数"_use_nosegment_indexes"为true,Oracle才会选择虚拟索引。

使用EXPLAIN PLAN或AUTOTRACE来查看执行计划,验证虚拟索引是否生效。

实例:

 

SQL> create table tt as select * from dba_objects;


Table created.


SQL> create index idx_test_virtual on tt(object_id) nosegment;


Index created.


SQL>     alter session set "_use_nosegment_indexes"=true;  


Session altered.


SQL> set autotrace traceonly explain;


SQL>  select * from tt where object_id='100';


Execution Plan

----------------------------------------------------------

Plan hash value: 1614994782


--------------------------------------------------------------------------------------------------------

| Id  | Operation     | Name        | Rows  | Bytes | Cost (%CPU)| Time     |

--------------------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT     |        |    15 |  7215 |     5 (0)| 00:00:01 |

|   1 |  TABLE ACCESS BY INDEX ROWID BATCHED| TT        |    15 |  7215 |     5 (0)| 00:00:01 |

|*  2 |   INDEX RANGE SCAN     | IDX_TEST_VIRTUAL |   277 |       |     1 (0)| 00:00:01 |

--------------------------------------------------------------------------------------------------------


Predicate Information (identified by operation id):

---------------------------------------------------


   2 - access("OBJECT_ID"=100)


Note

-----

   - dynamic statistics used: dynamic sampling (level=2)




三、特点与限制

特点:

虚拟索引不会增加存储空间的使用。

虚拟索引支持B-TREE索引和BIT位图索引。

在CBO(Cost-Based Optimizer,基于代价的优化器)模式下,Oracle优化器会考虑虚拟索引;

但在RBO(Rule-Based Optimizer,基于规则的优化器)模式下,需要添加hint才行。

限制:

虚拟索引无法执行ALTER INDEX选项,如重建索引等。

使用回收站特性时,虚拟索引必须显式DROP,才能创建同名的索引。

不能创建和虚拟索引同名的实际索引。

虚拟索引分析有效,但数据字典里可能查不到结果,因为Oracle可能内部临时保存了分析结果。

四、使用场景示例

假设有一个性能较差的SQL语句,涉及几个数据量非常大的表。如果想尝试新增一个索引来优化性能,

但不确定优化器是否会使用该索引,或者使用该索引后执行计划是否能朝着预想的方向发展。

此时,可以在大表上创建一个虚拟索引来测试其效果,而无需承担创建和删除实际索引的高昂代价和潜在风险。


五、注意事项

虚拟索引并不是物理存在的,所以不要用自动跟踪去测试虚拟索引,因为那是实际执行的效果,用不到虚拟索引。

在生产环境中使用虚拟索引时,应谨慎操作,并确保不会对数据库中运行的其他查询的执行计划产生负面影响。

综上所述,Oracle虚拟索引是一种强大的工具,可以帮助DBA在SQL优化过程中更有效地评估索引的潜在影响。

然而,在使用时也需要了解其特点和限制,以确保正确和有效地利用这一功能。




















来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69924215/viewspace-3047786/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: rac修改监听端口
请登录后发表评论 登录
全部评论

注册时间:2019-05-19

  • 博文量
    81
  • 访问量
    90374