Oracle SQL调优系列之虚拟索引用法简介

举报
yd_273762914 发表于 2020/12/03 00:08:16 2020/12/03
【摘要】 本博客记录一下Oracle虚拟索引的用法,虚拟索引是定义在数据字典中的伪索引,可以说是伪列,没有修改的索引字段的。虚拟索引的目的模拟索引,不会增加存储空间的使用,有了虚拟索引,开发者使用执行计划的时候也不需要等索引完全创建好才可以看到效果 ok,这里找张用户表来测试一下虚拟索引 //设置执行计划 SQL> set autotrace traceonly //...

本博客记录一下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 |
...//省略执行计划信息


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62

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

alter session set "_use_nosegment_indexes"=true;

create index index_name on table_name(col_name) nosegment;

  
 
  • 1
  • 2
  • 3

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

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

  
 
  • 1

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

文章来源: smilenicky.blog.csdn.net,作者:smileNicky,版权归原作者所有,如需转载,请联系作者。

原文链接:smilenicky.blog.csdn.net/article/details/89761234

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。