当前位置:  数据库>oracle

Oracle虚拟索引

    来源: 互联网  发布时间:2017-06-26

    本文导语: 从9.2版本开始Oracle引入了虚拟索引的概念,虚拟索引是一个“伪造”的索引,它的定义只存在数据字典中并有存在相关的索引段。虚拟索引是为了在不真正创建索引的情况下,验证如果使用索引sql执行计划是否改变,执行效率是...

从9.2版本开始Oracle引入了虚拟索引的概念,虚拟索引是一个“伪造”的索引,它的定义只存在数据字典中并有存在相关的索引段。虚拟索引是为了在不真正创建索引的情况下,验证如果使用索引sql执行计划是否改变,执行效率是否能得到提高。
本文在11.2.0.4版本中测试使用虚拟索引

1、创建测试表
ZX@orcl> create table test_t as select * from dba_objects;
 
Table created.
 
ZX@orcl> select count(*) from test_t;
 
  COUNT(*)
----------
    86369

2、查看一个SQL的执行计划,由于没有创建索引,使用TABLE ACCESS FULL访问表

ZX@orcl> set autotrace traceonly explain
ZX@orcl> select object_name from test_t where object_id=123;
 
Execution Plan
----------------------------------------------------------
Plan hash value: 2946757696
 
----------------------------------------------------------------------------
| Id  | Operation    | Name  | Rows  | Bytes | Cost (%CPU)| Time      |
----------------------------------------------------------------------------
|  0 | SELECT STATEMENT  |    | 14 |  1106 |  344  (1)| 00:00:05 |
|*  1 |  TABLE ACCESS FULL| TEST_T |  14 |  1106 |  344  (1)| 00:00:05 |
----------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
  1 - filter("OBJECT_ID"=123)
 
Note
-----
  - dynamic sampling used for this statement (level=2)

3、创建虚拟索引,数据字典中有这个索引的定义但是并没有实际创建这个索引段
ZX@orcl> set autotrace off
ZX@orcl> create index idx_virtual on test_t (object_id) nosegment;
 
Index created.
 
ZX@orcl> select object_name,object_type from user_objects where object_name='IDX_VIRTUAL';
 
OBJECT_NAME                                                          OBJECT_TYPE
-------------------------------------------------------------------------------------------------------------------------------- -------------------
IDX_VIRTUAL                                                          INDEX
 
ZX@orcl> select segment_name,tablespace_name from user_segments where segment_name='IDX_VIRTUAL';
 
no rows selected

4、再次查看执行计划
ZX@orcl> set autotrace traceonly explain
ZX@orcl> select object_name from test_t where object_id=123;
 
Execution Plan
----------------------------------------------------------
Plan hash value: 2946757696
 
----------------------------------------------------------------------------
| Id  | Operation    | Name  | Rows  | Bytes | Cost (%CPU)| Time      |
----------------------------------------------------------------------------
|  0 | SELECT STATEMENT  |    | 14 |  1106 |  344  (1)| 00:00:05 |
|*  1 |  TABLE ACCESS FULL| TEST_T |  14 |  1106 |  344  (1)| 00:00:05 |
----------------------------------------------------------------------------

5、我们看到执行计划并没有使用上面创建的索引,要使用虚拟索引需要设置参数
ZX@orcl> alter session set "_use_nosegment_indexes"=true;
 
Session altered.

6、再次查看执行计划,可以看到执行计划选择了虚拟索引,而且时间也缩短了。
ZX@orcl> select object_name from test_t where object_id=123;
 
Execution Plan
----------------------------------------------------------
Plan hash value: 1533029720
 
-------------------------------------------------------------------------------------------
| Id  | Operation          | Name  | Rows  | Bytes | Cost (%CPU)| Time  |
-------------------------------------------------------------------------------------------
|  0 | SELECT STATEMENT      |        |    14 |  1106 |  5  (0)| 00:00:01 |
|  1 |  TABLE ACCESS BY INDEX ROWID| TEST_T  |    14 |  1106 |  5  (0)| 00:00:01 |
|*  2 |  INDEX RANGE SCAN      | IDX_VIRTUAL |  315 |    |  1  (0)| 00:00:01 |
-------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
  2 - access("OBJECT_ID"=123)
 
Note
-----
  - dynamic sampling used for this statement (level=2)

从上面的执行计划可以看出创建这个索引会起到优化的效果,这个功能在大表建联合索引优化能起到很好的做作用,可以测试多个列组合哪个组合效果最好,而不需要实际每个组合都创建一个大索引。
7、删除虚拟索引
ZX@orcl> drop index idx_virtual;
 
Index dropped.

MOS文档:Virtual Indexes (文档 ID 1401046.1)


    
 
 

您可能感兴趣的文章:

  • 老大们,虚拟机上系统os是linux,我想在它安装oracle,怎么实现? iis7站长之家
  • 从Oracle的约束到索引
  • Oracle 9i轻松取得建表和索引的DDL语句
  • Oracle9i取得建表和索引的DDL语句
  • oracle10g全文索引自动同步语句使用方法
  • Oracle建立二进制文件索引的方法
  • 在Oracle 10g中如何获得索引的专家建议
  • Oracle全文索引设置
  • 用Oracle 9i全索引扫描快速访问数据
  • Oracle中如何把表和索引放在不同的表空间里
  • Oracle索引存储关系到数据库的运行效率
  • Oracle索引聚簇表的数据加载
  • 在Oracle中监控和跟踪索引使用情况
  • oracle 索引的相关介绍(创建、简介、技巧、怎样查看) .
  • Oracle中检查是否需要重构索引的sql
  • 轻松取得Oracle 9i建表和索引DDL语句
  • 深度揭露Oracle索引使用中的限制
  • Oracle索引(B*tree与Bitmap)的学习总结
  • oracle 索引不能使用深入解析
  • SQL Server和Oracle数据库索引介绍
  • Oracle发布Oracle VM 2.2升级虚拟化平台
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle推最新版Oracle VM服务器虚拟软件
  • 老大们,虚拟机上系统os是linux,我想在它安装oracle,怎么实现?
  • 请教怎样在虚拟机中的linux系统安装 Java环境以及Oracle
  • MySQL类似Oracle的dual虚拟表
  • linux 4虚拟机下安装oracle 10g失败。
  • Oracle虚拟桌面基础架构(VDI)3.2上市
  • RedHat AS 4 安装oracle9i的时候,执行Disk1下的runInstaller后提示正在初始化虚拟机,请等待后就再无反应
  • Linux虚拟机上安装Oracle 10g数据库现让远端的plsql访问
  • Oracle在虚拟化战争中能否胜出
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • Oracle 数据库开发工具 Oracle SQL Developer
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle EBS R12 支持 Oracle Database 11g
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • SCO unix下安装oracle,但没有光盘,请大家推荐一个oracle下载站点(unix版本的)。谢谢!!!!
  • Oracle 10g和Oracle 11g网格技术介绍
  • 请问大家用oracle数据库, 用import oracle.*;下的东西么? 还是用标准库?
  • oracle中如何把表中具有相同值列的多行数据合并成一行
  • Linux /$ORACLE_HOME $ORACLE_HOME
  • Oracle 数据库(oracle Database)性能调优技术详解
  • Linux系统下Oracle的启动与Oracle监听的启动
  • ORACLE日期相关操作
  • 请问在solaris下安装ORACLE,用root用户和用oracle用户安装有什么区别么?
  • ORACLE数据库常用字段数据类型介绍
  • 网间Oracle的连接,远程连接Oracle服务器??
  • Oracle 12c的九大最新技术特性介绍
  • 请教:.profile中:if [ -d /opt/oracle/db01/app/oracle/product/9.2.0 ]是什么意思?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3