oracle 索引问题梳理
索引基础知识
索引概念
- 索引是为了加快数据的查找而创建的可选数据库对象
- 索引是建立在表的一列或多列上且进行排序的一种结构
- 通过指针快速定位数据行的方法,减少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 索引问题梳理相关推荐
- Oracle索引梳理系列(八)- 索引扫描类型及分析(高效索引必备知识)
理解oracle索引扫描类型的特点以及具体触发的条件,对于通过合理地使用索引,进行sql优化至关重要(例如组合索引的引导列的选择问题). 在总结索引扫描类型前,需要再次强调关于索引特点的几个关键点: ...
- Oracle索引梳理系列(六)- Oracle索引种类之函数索引
函数索引 1.1 概述 在实际应用中,当条件列使用函数运算进行数据匹配时,即使该列建立了索引,索引也不会被使用. 如下示例,其中在owner列上建立一个普通b-tree索引,观 察两种查询方式(不使用 ...
- Oracle索引梳理系列(二)- Oracle索引种类及B树索引
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
- Oracle索引梳理系列(九)- 浅谈聚簇因子对索引使用的影响及优化方法
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
- [转载]oracle索引的简单总结
原文地址:oracle索引的简单总结作者:kindle 一.索引的概念: 数据库的索引类似于书籍的索引.在书籍中,索引允许用户不必翻阅完整个书就能迅速地找到所需要的信息.在数据库中,索引也允许数据库程 ...
- 索引名 oracle,ORACLE 索引名称矫情
oracle 索引英文名称很多,翻译过来的话也很多中文名称,不过总得来说词不达意.也就是说讲中文的时候,对方无法理解你说的是啥意思,啥情况,啥原理. 比如前缀,非前缀.本地和全局,普通和分区.B树和位 ...
- Oracle索引失效问题
Oracle 索引不起作用的几种情况: 1,<> 2,单独的>,<,(有时会用到,有时不会) 3,like "%_" 百分号在前.(可采用在建立索引时用re ...
- Oracle 索引扫描的五种类型
之前在讨论CBO和RBO的时候提到了索引扫描的几种类型. Oracle Optimizer CBO RBO http://blog.csdn.net/tianlesoftware/archive/20 ...
- oracle索引对模糊查询,Oracle索引
一.Oracle索引原理 通俗易懂得讲,索引就是给每条记录建立了一个目录(索引), 每个建立的索引都是按照这个索引的字段去排序(实际未必是排序)存放, 然后按照索引字段去查询的时候,就先去查询索引,此 ...
- Oracle索引知识学习笔记
目录 一.Oracle索引简介 1.1 索引分类 1.2 索引数据结构 1.3 索引特性 1.4 索引使用注意要点 1.5.索引的缺点 1.6.索引失效 二.索引分类介绍 2.1.位图索引 1.2.函 ...
最新文章
- Java Timer 定时器的使用
- MAC YII 安装步骤
- ef6+mysql的bug
- oracle 11g r2配置文件,Oracle 11g R2 常用配置与日志的文件位置
- vavr_使用Vavr在Java 8流中更好的异常处理
- 荷兰籍空乘服务中国春运:对春节有着别样的感受
- 华中数控hnc一818b_数控车床精确对刀方法总结
- 征服大前端视频教程第一季(jQuery、HTML5、CSS3、Node.js)
- jQuery常用工具方法
- RS232串口线接法与线芯引脚定义
- UniAPP 使用高德地图,打包后定位api不执行
- 海明码,码距,海明校验码
- win10浏览器闪退_win10 edge浏览器闪退打不开的恢复方法
- 日常编程笔记 | 2022.10.1 | 归并排序_一无序列
- Bug:No artifacts configured
- 【英语:发音基础】A6.基础词汇-核心形容词
- odb++ DEMO
- 关于电脑外设键盘的讲解
- linux中lvm卷管理
- Ground truth 在计算机方面的意思