索引和未索引执行计划的比较_详解Oracle复合索引+实例说明

复合索引

复合索引顾名思义,区别于单列索引,是由两个或多个列一起构成的索引。其在B树上的数据结构是什么样?如下图,是一个包含两列的复合索引。

47a7b2c2d128e1474f69a646ef80febe.png

如果你观察仔细,还会发现它的叶子节点是ASC递增排序的。现根据第一个值排序,然后根据第二个值排序。查的时候也一样,先查第一个值,在查第二个值。可以想象三个列组成的复合索引数据结构该是什么样的。

在实际创建表时,一开始,只会创建一个主键id,oracle会为主键默认创建索引。随着经验的增加,开始去考虑性能,会开始研究索引,比如查询报表、订单等业务场景。这时候多多少少都会创建索引了,然后开始研究复合索引。复合索引首先带来的问题是你如何在脑海中构建一个B树上的复合索引结构?接下来就到了如何创建复合索引的问题。

索引的建立,是为了提高查询效率,但索引设计不合理,又很影响写性能,这就像CAP只能满足其中两个条件一样。所以完美的东西不存在,万物是在矛盾中前行。说白了,就是要用最少、结构最简单的索引来达到目标。

b69e6ce5d88376f635bfba19511f8ac0.png

基础环境

基础表:

3487f3bcb5df0f3b3258b92e57e36987.png

说明:

1、a、b和c都经常要被查询,并且有经常a、b、c组合查询的可能性

2、a列区分度不大,b和c都有区分度(数值不会过多重复)

思路:

1、分别在a、b和c上分别建单列索引,即我们最终有三个索引,分别是(a)、(b)、(c)。这当然可以。但还有没有更好的?

2、在(a、b)、(b、c)、(a、c)上建复合索引。这样也可以,但维护起来开销比较大,还有没有更好的?

3、在(a、b、c)上建复合索引。这样维护起来开销也很大。并且a作为先导列,区分度不大,不是一个很好的选择。

4、最好的,应该是在(b、c)上建立复合索引,在c上建单列索引,这样(b、c)索引可以覆盖到a and b和b and c查询,c单列索引可以覆盖到a和b查询。


实例测试

1、创建测试表

CREATE TABLE sunyang_test(  id number,  a number,  b number,  c number )tablespace ebiz; alter table sunyang_test add constraint pk_sunyang_test primary key (id) using index tablespace ebiz; 

2、插入数据

begin  for i in 1 .. 100000 loop  insert into sunyang_test values(i,mod(i,2),mod(i,20000),mod(i,20000));  end loop;  commit; end; 

3、创建索引

create index idx_sunyang_test_bc on sunyang_test(b,c) tablespace ebiz; create index idx_sunyang_test_c on sunyang_test(c) tablespace ebiz; 

4、执行下面的SQL

select * from sunyang_test where b=5000; 

执行计划:

ad68994601fe6caf7dcd2925570a05c4.png
select * from sunyang_test where c=5000; 

执行计划:

133043d5f21825804e19ca862e22578f.png
select * from sunyang_test where a=1 and b=5000; 

执行计划:

6f79aa44ebdff4a0a3eaf2e9e046413c.png
select * from sunyang_test where a=1 and c=5000; 

执行计划:

68c8254204b9c8786fa8f9ebb185122b.png
select * from sunyang_test where b=5000 and c=5000; 

执行计划:

137003d1862bbbc8e2287679e32a8f27.png
select * from sunyang_test where a=1 and b=5000 and c=5000; 

执行计划:

adaf83a7ba4dde65d46c0c69530b2c82.png

可以看到,在a列区分度不大,且需要a、b、c单列查询或组合查询时,这样建索引将所有查询情况都覆盖到了,并且索引不复杂。


5e9c983cfc702d98f4657bdbbe8c0c95.gif

复合索引的设计,对于前导列的选择(也就是复合索引中的第一个列)非常重要,至少不应该在这里选择a作为一个复合索引的前导列,因为a的区分度太低了。有人说,不是有INDEX SKIP SCAN吗?这个确实要看a的实际值,如果a的取值很少,比如这里的两个,那么可以走INDEX SKIP SCAN,否则开销是很大的,往往Oracle直接去FULL TABLE SCAN了,也不会去INDEX SKIP SCAN,因为其涉及到索引分裂。

后面会分享更多DBA方面内容,感兴趣的朋友可以关注下!

a141a56511d965118eba9efcf9922642.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/370799.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Datables使用总结

本文共四部分:官网 | 基本使用|遇到的问题|属性表 一:官方网站:[http://www.datatables.net/] 二:基本使用:[http://www.guoxk.com/node/jquery-datatables] 1、DataTables的默认配置 $(document).ready(function() { …

python面向窗体的开发_Python高级进阶#019 pyqt5菜单menu应用,新建多窗体

知识回顾:1.掌握的是QCalendarWidget日历控件2.click点击事件(信号)触发3.掌握日期的格式化QDate本节知识视频教程以下开始文字讲解:一、案例:菜单1.新建第一个窗体2.一级菜单的配置3.二级菜单的配置4.利用菜单功能实现界面跳转,实…

用方面清理代码

在我以前的文章中,我描述了字母转换,并且提到了我们使用AspectJ解决了该任务,但是我没有提及AspectJ的工作原理以及一般性的方面。 因此,在接下来的几行中,我将解释: 什么是面向方面的编程,为什…

java前三章总结

Java前三章总结 第一章:1.Java都有什么东西? Jdk(java开发工具包)包括 Jre(Java运行环境)---------->jvm(Java虚拟机) 应用(javac) Java API和一些常用的j…

原型 - 实现自己的jQuery

每个第一次使用jq的开发者都感到惊叹,jq的$太神奇了,究竟是怎么做到的使用$控制dom 赞叹前人之余,探究其本源才是前端开发者应该做的事,社区常常说,不要重复造轮子, 可是啊,连轮子都造不出来,又怎么去了解在什么环境下用什么轮子,怎么样才可以造成更加优秀的轮子, 不同阶段对…

html 用svg缩放拉伸,html – 拉伸SVG以适应其父级的100%高度和宽度

如果您对另一种选择开放,您可以使用纯CSS创建形状.它不会像SVG那样整洁,但它会响应:* {box-sizing:border-box;}.box {margin:40px;padding:0 10px;max-width:200px;display:inline-block;vertical-align:top;border-right:2px solid green;border-left:2px solid g…

server.transfer 无法跳转页面_H5 腾讯地图无法导航

uni-app 打包H5腾讯地图无法导航前言:最近几天用uni-app开发安卓和iOS应用,打包成APP安装包后,APP内做地图导航没有问题,APP内使用的是高德地图;但是打包成为H5页面后,运行在微信内置浏览器或者运行在第三方…

打破PermGen神话

在我的最新文章中,我解释了可能导致java.lang.OutOfMemoryError:PermGen空间崩溃的原因 。 现在该讨论该问题的可能解决方案了。 或者,更确切地说,是关于互联网对可能解决方案的建议。 不幸的是,我只能说,我…

Linux获取当前年月日后缀精确到微秒,例如2017-05-06T23:57:07.713171

代码如下&#xff1a;详细见注释 #include <stdio.h> #include <string.h> #include <time.h> #include <sys/time.h>int main() {struct timeval start;struct tm *local_time NULL;static char str_time[100];char ms[16];gettimeofday( &start…

PhiloGL学习(5)——神说要有光,便有了光

前言 上一篇文章中介绍了如何创建三维对象及加载皮肤&#xff0c;本文为大家介绍如何为场景添加光源。 一、 原理分析 光在任何地方都是非常重要的&#xff0c;无论在哪里都说是要发光发热&#xff0c;光和热也是分不开的。光线分为点光源和线光源&#xff0c;所谓点光源和线光…

android 弹出弹框2秒消失_基于HTML5 Canvas 实现弹出框

前言用户鼠标移入时&#xff0c;有弹出框出现&#xff0c;这样的需求很常见。这在处理 HTML 元素实现时简单&#xff0c;但是如果是对 HTML5 Canvas 构成的图形进行处理&#xff0c;这种方法不再适用&#xff0c;因为 Canvas 使用的是另外一套机制&#xff0c;无论在 Canvas 上…

【CSS】小妙招,各种问题总结方法处理

1.实现div文字溢出自动省略号截取 overflow:hidden; /*超过部分不显示*/       text-overflow:ellipsis; /*超过部分用点点表示*/       white-space:nowrap;/*不换行*/ 2.规定行数的截取效果 text-overflow: ellipsis; /*有些示例里需要定义该属性&#xff0c…

Java2Days 2012:Java EE

Java2Days会议是东欧的主要活动&#xff0c;目的是介绍Java开发的最新趋势。 今年&#xff0c;该活动于10月25日至26日在保加利亚的索非亚举行。 我在那里&#xff0c;并有机会与一些SAP的同事一起品尝了一些最新的Java&#xff0c;云和移动内容&#xff0c;这些内容已直接发送…

html5布局总结,HTML5网页布局的总结

可以通过 和 将 html 元素组合起来。html 块元素大多数 html 元素被定义为块级元素或内联元素。编者注&#xff1a;“块级元素”译为 block level element&#xff0c;“内联元素”译为 inline element。块级元素在显示时&#xff0c;通常会以新行来开始(和结束)。例子&#x…

c++ 优先队列_C/C++数据结构:队列结构最全解析!带你零基础入门队列结构

前言上一章节针对于C语言栈结构做了解析&#xff0c;不清楚的可以回顾一下。本章节主要针对于C语言的基础数据结构队列做以解析。数据结构之队列队列是一种特殊的 线性表 &#xff0c;特殊之处在于它只允许在表的前端&#xff08;front&#xff09;进行删除操作&#xff0c;而在…

bit-map再显身手:test.txt中有42亿个无符号整数, 求不存在于test.txt中的最小无符号整数。限制: 可用内存为600MB....

先看看这个题目&#xff1a;test.txt中有42亿个无符号整数&#xff0c; 求不存在于test.txt中的最小无符号整数. 限制&#xff1a; 可用内存为600MB. 又是大数据。 看到42亿&#xff0c; 有灵感没&#xff1f; 要知道&#xff0c; 2的32次方就是42亿多一点点啊。42亿个无符号…

周期均方根和有效值的区别_黑猪肉和白猪肉有啥区别?

为啥散养黑猪肉的价格要比白猪贵很多?这其中的原因不看不知道!市面上的散养黑猪肉通常要比白猪肉贵很多&#xff0c;但是仍有不少人喜欢买黑猪肉回家吃&#xff0c;散养黑猪肉和白猪肉不仅仅是口感上有所差距&#xff0c;其价值差距体现在很多方面&#xff0c;接下来小编就和大…

BZOJ1734: [Usaco2005 Feb]Aggressive cows 愤怒的牛

【传送门&#xff1a;BZOJ1734】 简要题意&#xff1a; 约翰有N 间牛棚&#xff0c;这些牛棚坐落在一条直线上&#xff0c;第i 间牛棚位于坐标Xi 的位置。他要把C 头 奶牛安排在这些牛棚里。每间牛棚最多可以放一头奶牛&#xff0c;也可以空着。这些奶牛的脾气都很暴燥&#xf…

CSS基础范例

1 <!DOCTYPE html>2 <html lang"en">3 <head>4 <meta charset"UTF-8">5 <title>Title</title>6 <style>7 *{8 margin: 0; /*重置*/9 padding: 0…

测试环境搭建流程_前端构建 DevOps 搭建 DevOps 基础平台(中)

前言搭建基础平台搭建上篇的时候的时候&#xff0c;已经介绍过了项目流程设计、数据库搭建、jwt 登录等模块。此篇我们介绍分支管理设计及其他的基础模块。后端模块DevOps - Gitlab Api使用(已完成&#xff0c;点击跳转)DevOps - 搭建 DevOps 基础平台(已完成 50%)基础平台搭建…