一、前言
从9.2版本开始Oracle引入了虚拟索引的概念,虚拟索引是一个“伪造”的索引,它的定义只存在数据字典中并有存在相关的索引段。虚拟索引是为了在不真正创建索引的情况下,验证如果使用索引sql执行计划是否改变,执行效率是否能得到提高。
二、知识点
2.1、虚拟索引支持类型
虚拟索引支持B-TREE索引和BIT位图索引,在CBO模式下ORACLE优化器会考虑虚拟索引,但是在RBO模式下需要添加hint才行。
2.2、虚拟索引创建语法
--使用虚拟索引需要设置隐含参数
alter session set "_use_nosegment_indexes"=true;
2.3、虚拟索引删除
drop index virtual_XXX_index_name;
三、测试
有时为了性能优化需要,测试下创建索引对性能的改善,想通过测试虚拟索引来验证下使用索引是否带来性能改善,但创建虚拟索引也会对当前数据库产生影响,严重会导致锁表甚至引起数据库hang。
为了测试虚拟索引对数据库的影响,接下来在测试环境进行了模拟测试。
打开一个session,模拟DML操作,修改一个字段数值,不提交
然后另开一个session,来模拟创建虚拟索引
alter session set “_use_nosegment_indexes”=true;
会提示ORA-00054: resource busy报错,无法在待修改字段上创建索引。
接下来再测试在该表其它字段上能否正常创建虚拟索引
发现也是同样报错
接下来尝试在nosegment 后添加 online
提示ORA-02158: invalid CREATE INDEX option
所以:勿轻易在生产时段,尤其是业务比较繁忙的表创建虚拟索引。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。








