索引基础知识

索引概念

  • 索引是为了加快数据的查找而创建的可选数据库对象
  • 索引是建立在表的一列或多列上且进行排序的一种结构
  • 通过指针快速定位数据行的方法,减少CPU和磁盘的I/O
  • 索引是由Oracle自动使用和维护的,数据更新会自动传播到所有相关的索引
  • 索引存在双面性,表面存在过多的索引会影响到DML语句的性能

索引类型

  • 唯一索引
保证在定义索引的列中没有重复值
Oracle自动在表的主键列上创建唯一索引
唯一索引对应的字段上可以插入null值

语法:

create unique index idx_name on tab_name (col_name);
  • 倒序索引
键值在索引上是倒叙存放的(由大到小)

语法:

create index idx_name on tab_name (col_name desc);
  • 反向健索引
反转索引列键值的每个字节,比如:1234 1235 反转后:4321 5321
通常建立在值是连续增长的列上,防止索引在最右侧的叶子块争用

语法:

create index idx_name on tab_name (col_name) reverse;
  • 函数索引
基于一个或多个列上的函数或者表达式创建的索引
通常会有额外的一些开销,比如空间、性能,但总体可控。

语法:

create index idx_name on tab_name (to_char(col_name,’yyyy-mm-dd’));
  • 位图索引
一个键值存储指向多行数据的指针,可以存储null值
适合创建在低基数(cardinality)列上,但不适合频繁修改的列、多个会话并发修改的表

语法:

create bitmap index idx_name on tab_name (col_name);

获取sql执行计划

  • 常用方法
PL/SQL Developer工具F5键
explain plan for
set autotrace on
set autotrace traceonly
索引范围扫描:INDEX RANGE SCAN
索引唯一扫描:INDEX UNIQUE SCAN
索引跳跃扫描:INDEX SKIP SCAN
索引全扫描:  INDEX FULL SCAN

索引失效场景

以下场景可能导致使用不上索引

字段不是索引的前导列
字段使用like且%放在前面
字段上存在函数或者数值运算
查询谓词条件使用 is null 或 <>
索引导致执行结果不正确
查询返回大量数据
统计信息不正确

例子

前提:
1.a、b、c都经常要被查询,并且有经常a、b、c组合查询的可能性
2.a列区分度不大,b和c都有区分度

思路:
1.分别建单列索引(a)(b)(c),但在大表把所有字段都列为索引显然不合理,且Oracle限制索引数32个
2.(a、b、c)组合索引,a作为先导列区分度不大,组合索引的第一列非常重要,区分度越高越靠前。
3.(b、c、a)组合索引,区分度较小的a只会徒增索引的开销
4.(b、c)组合索引,可以覆盖ab组合查询,bc组合查询,但ac组合因为c不是组合索引的先导列不能走索引
5.最终(b、c)组合索引+c单列索引是最优解

NULL值查询优化

查询语句

select * from test_tab where status is null;

数据分布

select count(*),status from test_tab group by status;
count(*)   status
----------  ---------
1995000  Y
500

索引设计

create index test_tab_idx1 on test_tab(status) online parallel 4;
alter index test_tab_idx1 noparallel;

表结构

OBJECT_ID   NOT NULL  NUMBER
OWNER                          VARCHAR2(20)
STATUS                          VARCHAR2(10)
CREATED                       DATE

索引重新设计

create index test_tab_idex2 on test_tab(status,object_id) online parallel 4;
alter index test_tab_idx2 noparallel;

索引热块争用问题

最右单调增长引起的叶子块争用问题

索引的特点是从小到大排好序,因此最右边的叶子块存的是最大的值
对于单调增长的字段,新插入的一定是最大的值
新插入的最大值必定需要插入最右边的叶子块
当多个进程并发插入时,则最右边的叶子块成为热点块
常见的单向增长字段有序列(sequence)、时间(sysdate)

解决方案

哈希分区表
哈希分区索引
反向键索引

最大值最小值查询

查询SQL

select max(object_id) from test_tab where created=to_date('2021-12-12','yyyy-mm-dd');

索引设计

create index test_tab_idx1 on test_tab(create,object_id) online parallel 4;
alter index test_tab_idx1 noparallel;

查询SQL

select max(object_id) as max_id,min(object_id) as min_id from test_tab;

object_id 为主键索引

优化SQL

select (select min(object_id) from test_tab) min_id,(select max(object_id) from test_tab) max_id from dual;

优化实例

在日均交易量较平均的情况下,wkdt具有较强区分度


当扩大日期范围,日期的区分度不能体现

使用常用且比较由区分度的字段payeracct和payeeacct做组合索引

oracle 索引问题梳理相关推荐

  1. Oracle索引梳理系列(八)- 索引扫描类型及分析(高效索引必备知识)

    理解oracle索引扫描类型的特点以及具体触发的条件,对于通过合理地使用索引,进行sql优化至关重要(例如组合索引的引导列的选择问题). 在总结索引扫描类型前,需要再次强调关于索引特点的几个关键点: ...

  2. Oracle索引梳理系列(六)- Oracle索引种类之函数索引

    函数索引 1.1 概述 在实际应用中,当条件列使用函数运算进行数据匹配时,即使该列建立了索引,索引也不会被使用. 如下示例,其中在owner列上建立一个普通b-tree索引,观 察两种查询方式(不使用 ...

  3. Oracle索引梳理系列(二)- Oracle索引种类及B树索引

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

  4. Oracle索引梳理系列(九)- 浅谈聚簇因子对索引使用的影响及优化方法

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

  5. [转载]oracle索引的简单总结

    原文地址:oracle索引的简单总结作者:kindle 一.索引的概念: 数据库的索引类似于书籍的索引.在书籍中,索引允许用户不必翻阅完整个书就能迅速地找到所需要的信息.在数据库中,索引也允许数据库程 ...

  6. 索引名 oracle,ORACLE 索引名称矫情

    oracle 索引英文名称很多,翻译过来的话也很多中文名称,不过总得来说词不达意.也就是说讲中文的时候,对方无法理解你说的是啥意思,啥情况,啥原理. 比如前缀,非前缀.本地和全局,普通和分区.B树和位 ...

  7. Oracle索引失效问题

    Oracle 索引不起作用的几种情况: 1,<> 2,单独的>,<,(有时会用到,有时不会) 3,like "%_" 百分号在前.(可采用在建立索引时用re ...

  8. Oracle 索引扫描的五种类型

    之前在讨论CBO和RBO的时候提到了索引扫描的几种类型. Oracle Optimizer CBO RBO http://blog.csdn.net/tianlesoftware/archive/20 ...

  9. oracle索引对模糊查询,Oracle索引

    一.Oracle索引原理 通俗易懂得讲,索引就是给每条记录建立了一个目录(索引), 每个建立的索引都是按照这个索引的字段去排序(实际未必是排序)存放, 然后按照索引字段去查询的时候,就先去查询索引,此 ...

  10. Oracle索引知识学习笔记

    目录 一.Oracle索引简介 1.1 索引分类 1.2 索引数据结构 1.3 索引特性 1.4 索引使用注意要点 1.5.索引的缺点 1.6.索引失效 二.索引分类介绍 2.1.位图索引 1.2.函 ...

最新文章

  1. Java Timer 定时器的使用
  2. MAC YII 安装步骤
  3. ef6+mysql的bug
  4. oracle 11g r2配置文件,Oracle 11g R2 常用配置与日志的文件位置
  5. vavr_使用Vavr在Java 8流中更好的异常处理
  6. 荷兰籍空乘服务中国春运:对春节有着别样的感受
  7. 华中数控hnc一818b_数控车床精确对刀方法总结
  8. 征服大前端视频教程第一季(jQuery、HTML5、CSS3、Node.js)
  9. jQuery常用工具方法
  10. RS232串口线接法与线芯引脚定义
  11. UniAPP 使用高德地图,打包后定位api不执行
  12. 海明码,码距,海明校验码
  13. win10浏览器闪退_win10 edge浏览器闪退打不开的恢复方法
  14. 日常编程笔记 | 2022.10.1 | 归并排序_一无序列
  15. Bug:No artifacts configured
  16. 【英语:发音基础】A6.基础词汇-核心形容词
  17. odb++ DEMO
  18. 关于电脑外设键盘的讲解
  19. linux中lvm卷管理
  20. Ground truth 在计算机方面的意思

热门文章

  1. dependency-track 初始化源码解析
  2. python字体大小设置苹果电脑_如何调整Mac字体大小Mac字体大小调整方法
  3. 王燕 青岛高新职业学校 计算机,生化学院走访明月海藻集团
  4. 智能聊天对话机器人的对比
  5. 博弈论概述 (转自百度百科)
  6. ofd 文件发票解析
  7. 使用DevCpp/DevC++调试的设置和步骤
  8. TheFatRat生成免杀木马(powershell)报错问题
  9. 简明python教程电子书下载_简明Python教程PDF电子书免费下载
  10. 机器学习进阶路上不可错过的 28 个视频