概述

今天主要介绍Oracle数据库的三大索引类型,仅供参考。


一、B-Tree索引

三大特点:高度较低、存储列值、结构有序

1.1利用索引特性进行优化

外键上建立索引:不但可以提升查询效率,而且可以有效避免锁的竞争(外键所在表delete记录未提交,主键所在表会被锁住)。

  • 统计类查询SQL:count(), avg(), sum(), max(), min()
  • 排序操作:order by字段建立索引
  • 去重操作:distinct
  • UNION/UNION ALL:union all不需要去重,不需要排序

1.2联合索引

应用场景一:SQL查询列很少,建立查询列的联合索引可以有效消除回表,但一般超过3个字段的联合索引都是不合适的.
应用场景二:在字段A返回记录多,在字段B返回记录多,在字段A,B同时查询返回记录少,比如执行下面的查询,结果c1,c2都很多,c3却很少。

 select count(1) c1 from t where A = 1; select count(1) c2 from t where B = 2; select count(1) c3 from t where A = 1 and B = 2;

联合索引的列谁在前?
普遍流行的观点:重复记录少的字段放在前面,重复记录多的放在后面,其实这样的结论并不准确。

 drop table t purge; create table t as select * from dba_objects; create index idx1_object_id on t(object_id,object_type); create index idx2_object_id on t(object_type,object_id);
 --等值查询: select * from t where object_id = 20 and object_type = 'TABLE'; select /*+ index(t,idx1_object_id) */ * from t where object_id = 20 and object_type = 'TABLE'; select /*+ index(t,idx2_object_id) */ * from t where object_id = 20 and object_type = 'TABLE';

结论:等值查询情况下,组合索引的列无论哪一列在前,性能都一样。

 --范围查询: select * from t where object_id >=20 and object_id < 2000 and object_type = 'TABLE'; select /*+ index(t,idx1_object_id) */ * from t where object_id >=20 and object_id < 2000 and object_type = 'TABLE'; select /*+ index(t,idx2_object_id) */ * from t where object_id >=20 and object_id < 2000 and object_type = 'TABLE';

结论:组合索引的列,等值查询列在前,范围查询列在后。 但如果在实际生产环境要确定组合索引列谁在前,要综合考虑所有常用SQL使用索引情况,因为索引过多会影响入库性能。

1.3索引的危害

表上有过多索引主要会严重影响插入性能;

  • 对delete操作,删除少量数据索引可以有效快速定位,提升删除效率,但是如果删除大量数据就会有负面影响;
  • 对update操作类似delete,而且如果更新的是非索引列则无影响。

1.4索引的监控

 --监控 alter index [index_name] monitoring usage; select * from v$object_usage; --取消监控:  alter index [index_name] nomonitoring usage;

根据对索引监控的结果,对长时间未使用的索引可以考虑将其删除。

1.5索引的常见执行计划

INDEX FULL SCAN:索引的全扫描,单块读,有序
INDEX RANGE SCAN:索引的范围扫描
INDEX FAST FULL SCAN:索引的快速全扫描,多块读,无序
INDEX FULL SCAN(MIN/MAX):针对MAX(),MIN()函数的查询
INDEX SKIP SCAN:查询条件没有用到组合索引的第一列,而组合索引的第一列重复度较高时,可能用到


二、位图索引

应用场景:表的更新操作极少,重复度很高的列。

优势:count(*) 效率高

 create table t( name_id, gender not null, location not null, age_range not null, data )as select  rownum, decode(floor(dbms_random.value(0,2)),0,'M',1,'F') gender, ceil(dbms_random.value(0,50)) location, decode(floor(dbms_random.value(0,4)),0,'child',1,'young',2,'middle',3,'old') age_range, rpad('*',20,'*') data from dual connect by rownum <= 100000; 
 create index idx_t on t(gender,location,age_range); create bitmap index gender_idx on t(gender); create bitmap index location_idx on t(location); create bitmap index age_range_idx on t(age_range);
 select * from t where gender = 'M' and location in (1,10,30) and age_range = 'child'; select /*+ index(t,idx_t) */* from t where gender = 'M' and location in (1,10,30) and age_range = 'child';

三、函数索引

应用场景:不得不对某一列进行函数运算的场景。

利用函数索引的效率要低于利用普通索引的。

oracle中创建函数索引即是 你用到了什么函数就建什么函数索引,比如substr

select * from table where 1=1 and substr(field,0,2) in ('01')

创建索引的语句就是

create index indexname on table(substr(fileld,0,2)) online nologging ;


觉得有用的朋友多帮忙转发哦!后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~

oracle组合索引失效_一文看懂Oracle数据库的三大索引类型相关推荐

  1. oracle number类型_一文看懂Oracle分页实现方案的三种方式

    Oracle分页实现 闲来无事,整理下Oracle.mysql.mssql以及PG数据库的分页实现方式,大家可以简单做个对比,看下不同数据库在分页这块是怎么实现的.今天先介绍一下Oracle分页的实现 ...

  2. mysql 大量数据 更改索引_一文看懂ICP原理--MySQL用索引去表里取数据的一种优化...

    概述 今天主要介绍一下mysql的ICP特性,可能很多人都没听过,这里用一个实验来帮助大家加深一下理解. 一.Index_Condition_Pushdown Index Condition Push ...

  3. oracle创建dblink语句_一文看懂Oracle12c中多租户(容器)从种子创建PDB

    概述 在容器数据库CDB里面如何创建PDB,官方文档给出了一张创建PDB技术选项图,图片如下: 以下基于Oracle19c演示如何从种子创建PDB. 概述 使用种子(PDB$SEED)创建新的PDB, ...

  4. 12c表空间不存在_一文看懂Oracle查询表空间的每日增长量和历史情况统计

    概述 今天主要总结一下Oracle表空间每日增长和历史情况统计的一些脚本,仅供参考. 11g统计表空间的每日增长量 SELECT a.snap_id, c.tablespace_name ts_nam ...

  5. videojs默认显示controls 按钮功能失效_一文看懂Yearning SQL审核平台功能模块设计...

    概述 Yearning SQL审核平台目前兼容99%的Mysql 标准SQL语法. 已知不支持的语句类型有: 复杂的查询语句(多表,多函数,非必现.并不是所有复杂语句不支持) create table ...

  6. mysql 缓冲池监控_一文看懂mysql数据库监控指标--缓冲池使用情况

    如果你的数据库运行缓慢,或者出于某种原因无法响应查询,技术栈中每个依赖数据库的组件都会遭受性能问题.为了保证数据库的平稳运行,你可以主动监控以下这个与性能及资源利用率相关的指标:缓冲池使用情况. 缓冲 ...

  7. mysql存储过程输入参数拆分_一文看懂mysql数据库存储过程、函数、视图、触发器、表...

    概述 抽空总结一下mysql的一些概念性内容,涉及存储过程.函数.视图.触发器等. 一.查看存储过程.函数.视图.触发器.表 1.存储过程 select * from mysql.proc where ...

  8. mysql 不同分区 同时insert_一文看懂mysql数据库分区表概念、类型、适用场景、优缺点及原理...

    概述 最近对项目上部分表按时间做了分区,所以顺便整理下mysql分区表的一些内容,仅供参考. 一.分区表概念 分区是将一个表的数据按照某种方式,比如按照时间上的月份,分成多个较小的,更容易管理的部分, ...

  9. angular 字符串转换成数字_一文看懂Python列表、元组和字符串操作

    好文推荐,转自CSDN,原作星辰StarDust,感觉写的比自己清晰-大江狗荐语. 序列 序列是具有索引和切片能力的集合. 列表.元组和字符串具有通过索引访问某个具体的值,或通过切片返回一段切片的能力 ...

最新文章

  1. android 问题汇总系列之四
  2. stack UVA 442 Matrix Chain Multiplication
  3. HDU 1565 方格取数(1) ——插头DP
  4. 使用Eric构建Caffe应用程序-Baby年龄识别
  5. ss流量查询 php,Linux_Linux怎么使用ss命令查看系统的socket状态,  Linux系统中,ss命令可用于 - phpStudy...
  6. python选择法_新手小白如何学习Python 选对方法很重要(附教程)
  7. 智能卡卡发卡流程(收藏4)
  8. 用户-渠道的ROI计算及优化方案
  9. Android 布局 layout
  10. HMAC_SHA1和SHA1的区别
  11. Cross-modal Pretraining in BERT(跨模态预训练)
  12. 思维方式-《知识的边界》书中的精髓:互联网对知识的影响以及利用互联网获得更多知识的方法。
  13. 免费SVN代码托管,不限私有,不限成员
  14. 鸿蒙系统能超过ios多少年,未来3年,鸿蒙系统能与iOS系统媲美吗,能否超越iOS系统?...
  15. 关于校外访问西安电子科技大学校内图书馆资源和教务系统等的方法总结
  16. 串口工具推荐——串口监视精灵v4.0
  17. 《赢在中国》精彩评语
  18. 独立开发变现周刊(第43期):业余项目成功的秘密
  19. 中国DevOps现状调查报告(2019)转载
  20. java 抛出指定异常信息_java 抛出异常处理的方法

热门文章

  1. 数据中台和平台区别在哪
  2. 大数据分析系统包含哪些功能板块
  3. android迷宫源代码,迷宫 c++源代码(Maze c++ source code).doc
  4. python476集免费教材_476. 数字的补数 | python|python爬虫|python入门|python教程
  5. 第十二届蓝桥杯大赛软件赛决赛题解
  6. Mysql自定义Sequence-实现序列自增功能
  7. 【开源】微信小程序、小游戏以及 Web 通用 Canvas 渲染引擎 - Cax
  8. windows Mobile使用ActiveSync上网
  9. 如何在vs2010中使用ConfigurationManager
  10. Jira中的BUG导出