达梦数据库调优组合索引的使用

2023-10-27

调优工程中对组合索引的使用的一个小总结。

一、组合索引的执行计划
首先关于几个概念,等值条件和范围条件:
1、等值条件
C1 = X
C1 = X OR C1 = Y (会被优化成C1 IN (X,Y))
C1 IN (X,Y…)
这种形式的我们都叫做等值条件。
2、范围条件
C1 > X
C1 < Y
C1 > X AND C1 < Y
C1 BETWEEN X AND Y
这种形式的我们都叫做范围条件。
对于单表的访问,条件可以是任意个等值条件和范围条件的组合(我们仅考虑AND的情况,OR有单独的优化逻辑)。组合索引可用的条件是:
1)所有的等值条件都在索引的前面;
2)只允许存在一个范围条件,且在索引中,范围条件的列需要紧跟在等值条件的所有列后面;
比如存在等值条件 C1 C3 C5 C7,范围条件C4,那么索引(C1,C3,C5,C7,C4),(C1,C5,C3,C7,C4),(C7,C1,C3,C5,C4)都是可以利用的
而 (C1,C3,C5,C7,C6,C4),(C1,C3,C4,C5)这种不可用,或者只能利用到部分条件。
以下举例说明:
执行以下sql语句

DROP TABLE TEST1;
CREATE TABLE TEST1(ID INT,ID1 INT,ID2 INT,ID3 INT);
insert into test1 select dbms_random.value(1,15000),dbms_random.value(1,15000),dbms_random.value(1,15000),dbms_random.value(1,15000) from dual connect by level <= 15000;
commit;

在这里插入图片描述
全表扫描后过滤,需要建立索引。

create index itest1 on test1(id,id1,id2,id3);

在这里插入图片描述
可以看到,查询走了索引,但是索引仅利用俩列scan_range[(5,5,min,min),(5,5,max,max)),且索引出来之后依然需要过滤(#SLCT2: [0, 1, 24]; TEST1.ID3 < 4),所以索引并没有完全利用,因为范围列id3 和等值列id,id1中间隔了一个id2,导致无法利用索引上id3的信息。
在这里插入图片描述
补上id2的条件后,对于TEST1的访问利用了索引上的所有信息scan_range((5,5,DMTEMPVIEW_16778286.colname,null2),(5,5,DMTEMPVIEW_16778286.colname,4),三个等值,一个范围,
形如DMTEMPVIEW_16778286.colname这种是因为IN的列表被转成了一个常数表,先扫描这个常数表,对于这个常数表中的每一个值,都附加上其他的条件一起(id =5 id1 =5 id3 <4)组合成一个条件对TEST1表进行过滤。

如果使用另一种方式建立索引:

create index itest2 on test1(id,id1,id3);

在这里插入图片描述
这样建立索引,扫描利用了索引上的所有信息scan_range((5,5,null2),(5,5,4)),但是多出了一个BLKUP操作,这个是因为索引不能提供select *需要的所有列,索引上不包含ID2,所以需要索引上提供的ROWID去原表(TEST1)上查找。

如果再用另一种方式建立索引:

create index itest3 on test1(id,id1,id3,id2);

在这里插入图片描述
如图可见,BLKUP操作也可以消除了。
*这也是组合索引的另一个重要作用,附加上查询中需要的列可以减少BLKUP操作,一些场景下可以大幅提升并发性能。

二、连接中组合索引的使用
建立一张测试表:

CREATE TABLE TEST2(ID INT);
insert into test2 select level from dual connect by level < 3;
commit;

在这里插入图片描述
可以看到对于 TEST1的访问,完全利用了 TEST1.ID = TEST2.ID AND TEST1.ID1 < 5 ,scan_range[(TEST2.ID,null2,min,min),(TEST2.ID,5,min,max))。
当待访问表为连接右表时,等值连接可以作为一个特殊的等值条件,建立索引时可以考虑,规则和单表上的多条件是一致的。
在这里插入图片描述
查询中TEST1.ID2作为等值连接条件,对于TEST1所有的过滤为ID2的等值以及ID1的范围,但前面建立的索引没有满足可以利用条件的,索引对于TEST1表的访问走了全表扫描(SSCN,索引扫描);
且扫描后仅利用 TEST1.ID1 < 5 条件,因为等值连接的条件没有好的索引可以利用,等值条件转换为比嵌套连接更快的HASH来处理;
如果我们建立ID2,ID1索引,那么这个索引是可以被完全利用的。
在这里插入图片描述
可以看到,对于TEST1的访问完全利用了索引ITEST1的所有信息scan_range((4,5,TEST2.ID,null2),(4,5,TEST2.ID,7)),三个等值一个范围,连接条件作为等值条件不在索引的第一列没有问题,只要和其他的等值条件一起出现在范围条件前面就可以了。
在这里插入图片描述
这个计划中,利用索引ITEST1,但是只利用到了第一列scan_range[(DMTEMPVIEW_16778271.colname,min,min,min),(DMTEMPVIEW_16778271.colname,max,max,max),
其中DMTEMPVIEW_16778271.colname就是对于 IN(3,4,5)这种,服务器会把他转变成一个表,这个COLNAME就表示这个表上的列。
前面我们说 等值条件、连接等值条件 如果都在前面,范围在后面,是可以完全利用索引的,这里为什么不行呢?。
因为IN(XX,XX,XX …)是特殊的等值条件
优化器的处理是把IN 转变成 原表与常量表的连接,单表访问时,没有问题,但是如果原表还需要和另外一个表连接,若另外的表在右,则不能IN和连接条件同时作为原表的访问条件,若原表在左边,则没有另外一张表的连接列条件可用,所以连接列卡在包含IN等值条件中间的话,不能两者都利用索引定位。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

达梦数据库调优组合索引的使用 的相关文章

  • java的图片背景透明及透明度处理

    如题 以下为通过java实现的针对图片的背景透明及透明度处理 供大家需要时参考 设置源图片为背景透明 并设置透明度 param srcFile 源图片 param desFile 目标文件 param alpha 透明度 param for
  • activex控件 InvokeHelper

    当你调用关于activex控件中的相关方法时 你要导入此控件到程序中 此时就会在工程中生成一个关于此控件调用的一个伪调用类 其中的cpp中调用每 个方法都是通过InvokeHelper调用其中的dwDispID值来定位方法的地址的 因此 可
  • exports is not defined

    若是babel 6 可以看这位同仁的文章 https www cnblogs com vickya p 8645061 html 若是babel 7 设置 https www babeljs cn docs babel preset env
  • 【Python】文件操作 r+ 的问题

    问题背景 想用 python 实现文件的读取 并修改部分内容 再写回去 r 是最符合的权限 可读写 并且可以覆盖文件之前的内容 但是实际使用时 发现修改后的内容是追加的方式 而不是覆盖 with open gitignore r as f
  • CENTOS上的网络安全工具(二十四)Windows下的Hadoop+Spark编程环境构建

    前面我们搭建了hadoop集群 spark集群 也利用容器构建了spark的编程环境 但是一般来说 就并行计算程序的开发 一刚开始一般是在单机上的 比如hadoop的single node 但是老师弄个容器或虚拟机用vscode远程访问式开
  • MFC定时器SetTimer函数

    一 SetTimer表示的是定义个定时器 根据定义指定的窗口 在指定的窗口 CWnd 中实现OnTimer事件 这样 就可以相应事件了 SetTimer有两个函数 一个是全局的函数 SetTimer UINT SetTimer HWND h
  • C语言上机实验思路分享4

    实验内容 方法和步骤 1 输入 10 个整数 用选择法对这 10 个整数按从小到大的顺序排序并输出排序后的结 果 程序代码 include
  • 从现实抽象出类的步骤

    第一 找出分类 分析出类 第二 找出类的特征 分析类的相关属性 第三 找出类的行为 分析类的方法 转载于 https www cnblogs com liumeilin p 7018110 html
  • AVRCP协议介绍

    文章目录 1 AVRCP协议介绍 1 2 概念 1 2 1 1 2 2 role 用途 2 AVRCP框架 1 AVRCP协议介绍 1 2 概念 1 2 1 1 2 2 role CT controller 是一种通过向目标发送命令帧来启动

随机推荐

  • 静态编译和动态编译,java与javascript区别总结

    1 静态编译和动态编译 静态编译是程序在编译时就已经确定好了所有类之间的关系 要运行程序所有类 都缺一不可 若在开始运行时就把其中的某类文件丢失 就会产生 NoClassDefFoundError错误 程序会终止 在程序运行前的装载期间就把
  • flutter获取状态栏高度

    获取状态栏高度 import dart ui MediaQueryData fromWindow window padding top 系统默认的appBar等高度 位于Dart Packages flutter src material
  • 物理渲染学习笔记(三)——Cook-Torrance微表面模型

    从 Phong 到 GGX 光照模型林林总总 一直没能找机会梳理一遍 这几天依次都自己实现了一遍 也正好总结下 Microfacet 普通的着色模型假设着色的区域是一个平滑的表面 表面的方向可以用一个单一的法线向量来定义来定义 而 Micr
  • 程序员吃青春饭?程序员在35岁以后是否需要转行?你规划好了吗?

    都说程序员是一个吃青春饭的职业 都认为程序员到了35岁以后不转管理岗位就没有什么前途了 可能就要考虑换别的行业了 年龄越大可能越写不动代码了 那么程序员是不是35岁以后需要转行 我说说我自己的观点 关于程序员35岁之后是不是要转行这个问题
  • 区块链技术基础(笔记)

    一 区块链本质上是一个对等网络 peer to peer 的分布式账本数据库 二 区块链本身其实是一串链接的数据区块 其链接 指针是采用密码学哈希算法对区块头进行处理所产生的区块头哈希值 三 基本概念 1 数据区块 比特币的交易会保存在数据
  • Element ui 导航栏 刷新时高亮

    1 在组件中
  • 原理解析:JS 代码是如何被浏览器引擎编译、执行的?

    原理解析 JS 代码是如何被浏览器引擎编译 执行的 分析浏览器引擎对 JS代码的编译情况 并结合日常的 JavaScript开发经验 重新理解底层的编译解析机制 对其底层原理的理解 将有助于理解前端的跨端应用 以及一套代码生成多种小程序相关
  • csu 1809 Parenthesis 2016湖南省赛 G

    Problem acm csu edu cn csuoj problemset problem pid 1809 vjudge net contest 161962 problem G Reference blog csdn net l95
  • spring之bean注入的意义

    简而言之就是 首先 service注解在当前类的上边 表示在当前类是spring管理的一个bean 使用 autowired 将另外一个A类的实体bean注入到当前类中 让当前类具备那个A类的功能
  • Android SDK & AVD Manager

    0 前言 Android源码中的prebuilts devtools tools android程序可根据不同的参数来启动SDK Manager或AVD Manager 1 SDK Manager 1 启动 android or andro
  • Chrome 基于 Wappalyzer 查看网站所用的前端技术栈

    1 找到谷歌商店 https chrome google com webstore search wappalyzer utm source ext app menu 2 搜索 Wappalyzer 3 添加至Chrome 4 使用 插件
  • MySQL的脏读、幻读、不可重复读

    首先我们要知道 我们的脏读 幻读 不可重复读这些概念是在事务中的概念 脏读 也就是读取了未提交的数据 比如我开启了一个事务A 在里面操作一个用户表 获取里面一个用户的积分 比如此时这个用户的积分是100 此时有另外一个事务B也操作了这个用户
  • LD3320语音识别

    芯片介绍 LD3320 不需要外接任何辅助的Flash芯片 RAM芯片和AD芯片 就可以完成语音识别功能 每次识别最多可以设置50项候选识别句 每个识别句可以是单字 词组或短句 另一方面 识别句内容可以动态编辑修改 只需要主控MCU把识别关
  • 碎碎念,浅浅饮-------Day30

    这不是一篇关乎技术的文章 它偏离了我原本的计划轨迹 但是 相信它的意义会远超出任何一项技术带给我的价值 高考已经开始了 不知道在这片宁静的夜空下有多少人已经美美的睡了 香甜憨然 又有多少人这睡着的眼角还挂着泪滴 偶尔蹙起眉头 却也记载不下那
  • 固态硬盘接口类型介绍

    固态硬盘接口类型介绍 现在装机硬盘肯定会首选SSD 容量小一点不怕 后面再补一个机械硬盘不迟 SSD有着稳固和高速的优势 深受用户喜爱 然而SSD有着各种各样的尺寸和接口 并不是每一个用户的电脑都能通用 所以选购SSD硬盘前必须先了解SSD
  • ajax请求出现闪屏,jquery $.Ajax 火狐浏览器闪屏解决办法

    本文章介绍了关于jquery的async false Ajax 火狐浏览器闪屏解决办法 jquery的async false 这个属性 默认是true 异步 false 同步 代码如下 复制代码 ajax type post url pat
  • vue2知识点梳理

    Vue梳理 对于Vue 我们并不陌生 现在我们来梳理一下关于它的东西吧 知识点 1 生命周期 最基本的就是它的生命周期 beforeCreate 在 beforeCreate 生命周期函数执行时 data 和 methods 中的数据都还没
  • Open3D (C++) 点云按坐标值大小进行排序

    目录 一 概述 二 点云排序 三 结果展示 一 概述 如题 点云按坐标大小进行排序 二 点云排序 代码以按照Z坐标的大小按照从小到大进行排序为例 include
  • java输出1~100之间的全部素数的5种方法

    文章目录 一 前言 二 需求分析 2 1 什么是素数 2 2 分析 三 代码实现 3 1 方法一 根据素数的定义来遍历检查 3 2 方法二 根据判断条件2进行遍历检查 减少遍历次数 3 3 方法三 根据判断条件3进行遍历检查 减少遍历次数
  • 达梦数据库调优组合索引的使用

    调优工程中对组合索引的使用的一个小总结 一 组合索引的执行计划 首先关于几个概念 等值条件和范围条件 1 等值条件 C1 X C1 X OR C1 Y 会被优化成C1 IN X Y C1 IN X Y 这种形式的我们都叫做等值条件 2 范围