Oracle虚拟索引的运用

在做SQL调优的时候,有的时候需要加一个索引,测试下对性能提升有没有帮组,如果此时这张表非常大,建索引将会非常之麻烦,这种场景虚拟索引就该登场了。下面来做个试验:

SQL> select * from v$version;

BANNER

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

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bi

PL/SQL Release 10.2.0.1.0 - Production

CORE    10.2.0.1.0      Production

TNS for 64-bit Windows: Version 10.2.0.1.0 - Production

NLSRTL Version 10.2.0.1.0 - Production

SQL> drop table test purge;

SQL> create table test as select * from user_objects;

SQL> select count(1),

count(distinct object_name) c_oname,

count(distinct object_type) s_otype

from test;

COUNT(1)    C_ONAME    S_OTYPE

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

11500      11430         14

SQL> create index ind_test_name on test(object_name) nosegment;

SQL> create index ind_test_otype on test(object_type) nosegment;

SQL> exec dbms_stats.gather_table_stats(user,‘test‘,cascade=>true);

SQL> --必须设置隐含参数”_use_nosegment_indexes”=true(默认为false)后,CBO才能使用虚拟索引

SQL> alter session set "_use_nosegment_indexes"=true;

SQL> set autotrace trace exp

SQL> select * from test where object_name=‘TEST‘;

执行计划

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

Plan hash value: 3675505035

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

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

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

|   0 | SELECT STATEMENT            |               |     1 |    86 |     2   (0)| 00:00:01 |

|   1 |  TABLE ACCESS BY INDEX ROWID| TEST          |     1 |    86 |     2   (0)| 00:00:01 |

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

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

Predicate Information (identified by operation id):

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

2 - access("OBJECT_NAME"=‘TEST‘)

SQL> select * from test where object_type=‘TEST‘;

执行计划

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

Plan hash value: 1357081020

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

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

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

|   0 | SELECT STATEMENT  |      |   821 | 70606 |    36   (0)| 00:00:01 |

|*  1 |  TABLE ACCESS FULL| TEST |   821 | 70606 |    36   (0)| 00:00:01 |

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

Predicate Information (identified by operation id):

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

1 - filter("OBJECT_TYPE"=‘TEST‘)

SQL> set autotrace off

SQL> select index_name from user_indexes s where s.table_name =‘TEST‘;

未选定行

SQL> col object_name format a15;

SQL> select object_name,object_id,object_type  from user_objects s

where s.object_name in (‘IND_TEST_NAME‘, ‘IND_TEST_OTYPE‘);

OBJECT_NAME      OBJECT_ID OBJECT_TYPE

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

IND_TEST_NAME       670666 INDEX

IND_TEST_OTYPE      670667 INDEX

SQL> select segment_name,s.bytes from user_segments s where s.segment_name

in (‘IND_TEST_NAME‘, ‘IND_TEST_OTYPE‘);

未选定行

原理:加了虚拟索引后,同时开启_use_nosegment_indexes,CBO在评估执行计划的时候会把虚拟索引当做是一个真实的索引,有点欺骗CBO的意思。不能在user_indexes和user_segments中找到,但在user_objects可以找到。说明虚拟说只是加了数据字典,并没有产生实际的数据,那它也应该不能像真实的索引哪有操作,再做一个试验:

SQL> alter index ind_test_name rebuild;

alter index ind_test_name rebuild

*

第 1 行出现错误:

ORA-08114: 无法改变假索引

最后:虚拟索引只适合做性能调优,加了之后记得要删除。

Oracle虚拟索引的运用

时间: 2024-08-02 11:05:02

Oracle虚拟索引的运用的相关文章

ORACLE虚拟索引(Virtual Index)

ORACLE虚拟索引(Virtual Index)   虚拟索引概念 虚拟索引(Virtual Indexes)是一个定义在数据字典中的假索引(fake index),它没有相关的索引段.虚拟索引的目的是模拟索引的存在而不用真实的创建一个完整索引.这允许开发者创建虚拟索引来查看相关执行计划而不用等到真实创建完索引才能查看索引对执行计划的影响,并且不会增加存储空间的使用.如果我们观察到优化器生成了一个昂贵的执行计划并且SQL调整指导建议我们对某些的某列创建索引,但在生产数据库环境中创建索引与测试并

Oracle虚拟索引

从9.2版本开始Oracle引入了虚拟索引的概念,虚拟索引是一个"伪造"的索引,它的定义只存在数据字典中并有存在相关的索引段.虚拟索引是为了在不真正创建索引的情况下,验证如果使用索引sql执行计划是否改变,执行效率是否能得到提高. 本文在11.2.0.4版本中测试使用虚拟索引 1.创建测试表 [email protected]> create table test_t as select * from dba_objects; Table created. [email prot

【索引】Oracle之不可见索引和虚拟索引的比对

[索引]Oracle之不可见索引和虚拟索引的比对    Oracle之不可见索引 :http://blog.itpub.net/26736162/viewspace-2124044/ Oracle之虚拟索引 :  http://blog.itpub.net/26736162/viewspace-2123687/   之前给大家分享过不可见索引和虚拟索引,今天给大家分享的是Oracle之不可见索引和虚拟索引的比对.   比较项目 不可见索引(Invisible Indexes) 虚拟索引(Virt

利用虚拟索引(Virtual Index)优化数据库的案例分析

当我们在对生产库做优化的时候,主要就是对SQL语句的优化,包括语句的等价改写等,但其中很大一部分情况,又与索引有关.如果能合理利用合适的索引,可以使原本走全表扫描产生的逻辑读大大降低,提高数据库的性能.由于Oracle数据库中的索引本身就要占用磁盘空间,维护索引需要一定的开销,如何才能知道创建某个索引,会给数据带来性能的提升,而又不至于判断失误,创建了一个不恰当的索引,最后又不得不删除呢?这种情况下,我们可以利用Oralce提供的虚拟索引,即nosegment索引,它并不占用磁盘资源,只是在数据

Oracle之索引(Index)实例讲解 - 基础

Oracle之索引(Index)实例讲解 - 基础 索引(Index)是关系数据库中用于存放表中每一条记录位置的一种对象,主要目的是加快数据的读取速度和数据的完整性检查.索引的建立是一项技术性要求非常高的工作. 一般在数据库设计阶段就要考虑到如何设计和创建索引. 1. 创建索引 创建索引的语法: CREATE [UNIQUE] INDEX [schema.] index ON [schema.] table (column [ASC | DESC], column [ASC | DESC]...

Oracle 分区索引

分区索引(或索引分区)主要是针对分区表而言的.随着数据量的不断增长,普通的堆表需要转换到分区表,其索引呢,则对应的转换到分区索引.分区索引的好处是显而易见的.就是简单地把一个索引分成多个片断,在获取所需数据时,只需要访问更小的索引片断(块)即可实现.同时把分区放在不同的表空间可以提高分区的可用性和可靠性.本文主要描述了分区索引的相关特性并给出演示示例. 1.分区索引的相关概念a.分区索引的几种方式:表被分区而索引未被分区:表未被分区,而索引被分区:表和索引都被分区b.分区索引可以分为本地分区索引

Oracle 建立索引及SQL优化

Oracle 建立索引及SQL优化 数据库索引: 索引有单列索引 复合索引之说 如何某表的某个字段有主键约束和唯一性约束,则Oracle 则会自动在相应的约束列上建议唯一索引.数据库索引主要进行提高访问速度. 建设原则: 1.索引应该经常建在Where 子句经常用到的列上.如果某个大表经常使用某个字段进行查询,并且检索行数小于总表行数的5%.则应该考虑. 2.对于两表连接的字段,应该建立索引.如果经常在某表的一个字段进行Order By 则也经过进行索引. 3.不应该在小表上建设索引. 优缺点:

Oracle监控索引是否被启用

创建Oracle索引: create index DEFECT_SUBMIT_DATE_IDX on Defect(Submit_Date);create index DEFECT_DBID_SUBMIT_DATE_IDX on Defect(dbid, Submit_Date); 删除索引: drop index DEFECT_SUBMIT_DATE_IDX; 设置监控索引: alter index DEFECT_SUBMIT_DATE_IDX monitoring usage; alter

Oracle索引总结(七)- Oracle唯一索引、普通索引及约束的关系

Oracle唯一索引.普通索引及约束的关系 在总结索引扫描类型前(不同于前面总结的五大类索引类型,索引类型主要是索引类别的划分,而索引扫描类型是索引在进行索引扫描时的具体方法),需要了解唯一索引.非唯一索引(普通索引)以及约束的关系.这是因为对于索引扫描类型的具体探讨上,需要根据"唯一索引"."非唯一索引(普通索引)"以及"约束",这三个概念的具体情况,进行具体说明,因此优先进行总结. 1.唯一索引与普通索引的概述 对于索引,如b-tree索引,