专栏首页Nicky's blogOracle性能调优之虚拟索引用法简介

Oracle性能调优之虚拟索引用法简介

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014427391/article/details/89761234

本博客记录一下Oracle虚拟索引的用法,虚拟索引是定义在数据字典中的伪索引,可以说是伪列,没有修改的索引字段的。虚拟索引的目的模拟索引,不会增加存储空间的使用,有了虚拟索引,开发者使用执行计划的时候也不需要等索引完全创建好才可以看到效果

ok,这里找张用户表来测试一下虚拟索引

//设置执行计划
SQL> set autotrace traceonly

//查询用户,因为没加索引,所以是全表扫描
SQL> select * from sys_user where username='admin';

//创建虚拟索引,记得加关键字nosegment
SQL>create index idx_username on sys_user(username) nosegment;

//先关了执行计划自动打印
SQL>set autotrace off

//查一下索引表里有对应索引字段?这里没查到,说明虚拟索引并没有创建索引列
SQL>  select index_name from dba_indexes where table_name='sys_user' and index_n
ame='IDX_USERNAME';
未选定行

//再查一下索引对象里有数据?这里可以查到,说明虚拟索引还是有创建索引对象的
SQL> select object_name,object_type from dba_objects where object_name='IDX_USER
NAME';
OBJECT_NAME          OBJECT_TYPE
--------------------              -------------------
IDX_USERNAME           INDEX

//再开启执行计划自动打印
SQL> set autotrace traceonly

//查询一下,发现还是TABLE ACCESS FULL,并没有走索引,不是创建了虚拟索引了?
SQL> select * from sys_user where username='admin';
执行计划
----------------------------------------------------------
Plan hash value: 4234589240
------------------------------------------------------------------------------
| Id  | Operation         | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |          |     1 |   272 |     3   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| SYS_USER |     1 |   272 |     3   (0)| 00:00:01 |
------------------------------------------------------------------------------
...//省略执行计划信息

//注意:虚拟索引使用,需要设置一下,改为true才可以
SQL> alter session set "_USE_NOSEGMENT_INDEXES" = true;
会话已更改。

//再次查询,可以看到走虚拟索引了,TABLE ACCESS BY INDEX ROWID,虚拟索引使用成功
SQL> select * from sys_user where username='admin';
执行计划
----------------------------------------------------------
Plan hash value: 1796849462
--------------------------------------------------------------------------------
| Id  | Operation                   | Name         | Rows  | Bytes | Cost (%CPU)
| Time     |
--------------------------------------------------------------------------------
------------
|   0 | SELECT STATEMENT            |              |     1 |   272 |     2   (0)
| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| SYS_USER     |     1 |   272 |     2   (0)
| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | IDX_USERNAME |     1 |       |     1   (0)
| 00:00:01 |
...//省略执行计划信息

综上分析,虚拟索引创建关键的步骤是:

alter session set "_use_nosegment_indexes"=true;

create index index_name on table_name(col_name) nosegment;

虚拟索引也可以删除,用法和删索引一样:

drop index [索引名称] on [表格名称]

这里就是虚拟索引的简要介绍,假如在生产环境,怕加了索引影响系统性能,或许可以加虚拟索引,怕占太多存储空间,也可以加上虚拟索引,虚拟索引有时候常被用于SQL调优,虚拟索引关键字是nosegment

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Oracle优化器基础知识

    本博客介绍一下属于oracle优化器范畴的一些基础知识,访问数据的方法,分为直接访问数据的方法和访问索引的方法两种,然后有了这些基础知识后,可以参考学习我的另外...

    SmileNicky
  • MySQL索引知识学习笔记

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    SmileNicky
  • Oracle索引知识学习笔记

    Oracle索引中最常用的是BTree索引,所以就以BTree索引为例,讲一下BTree索引,BTree索引数据结构是一种二叉树的结构,索引由根块(Root)、...

    SmileNicky
  • MySQL和Lucene(Elasticsearch)索引对比分析

    相比于大多数人熟悉的 MySQL 数据库的索引,Elasticsearch 的索引机制是完全不同于 MySQL 的 B+Tree 结构。索引会被压缩放入内存用于...

    大数据技术与架构
  • 「Mysql索引原理(十二)」索引案例1-支持多种过滤条件

    假设要设计一个在线约会网站,用户信息表有很多列,包括国家、地区、城市、性别、眼睛颜色等等。网站必须支持上面这些特征的各种组合来搜索用户,还必须允许...

    源码之路
  • 听说Mysql你很豪横?-------------深入解析mysql数据库中的索引!

    主表中的外键是另一张表的主键。 候选键:除了主键以外的都是候选键。 要想能快速查找某一条你想要的数据,必须要要创建主键(一般在开始创建表的时候就会设置)。 ...

    不吃小白菜
  • Oracle优化器基础知识

    本博客介绍一下属于oracle优化器范畴的一些基础知识,访问数据的方法,分为直接访问数据的方法和访问索引的方法两种,然后有了这些基础知识后,可以参考学习我的另外...

    SmileNicky
  • 5年Java开发经验,面试挂在MySQL InnoDB上!大厂究竟多看重MySQL?

    前一段时间好兄弟找工作,面试 Java 资深研发工程师岗位,接到了不少大厂的面试邀请,有顺利接到 offer 的,也有半道儿面试被卡掉的。但最想去的企业却因为 ...

    烂猪皮
  • 美团点评广告实时索引的设计与实现

    美团技术团队
  • 2018最新淘宝面试出炉:分布式锁+集群+一致Hash算法+底层技术原理

    1.Java基础还是需要掌握牢固,重点会问HashMap等集合类,以及多线程、线程池等。

    欧阳愠斐

扫码关注云+社区

领取腾讯云代金券