如何解决索引分裂问题?

索引分裂

索引块快写满时就会发生索引分裂,索引分裂分为两种情况,55和91:

索引分裂和enq: TX - index contension等待事件的区别
无论是55还是91,都是数据增多后索引的正常行为,索引分裂是业务数据量增大导致索引增大的正常现象,索引放不下了自然要更多的索引块来存放数据,基本也没有只有表无索引的情况(在初始化数据的场景下,才会考虑先插入数据,再建索引)。索引分裂虽然有一定的资源消耗,但是在现在的oracle环境中也是可以很快完成的,索引过多的话才会影响插入效率。
而enq: TX - index contension这个等待就不是正常现象了。enq: TX - index contension等待表示SQL在等待正在发生分裂的索引块,本质上是DML并发过大且都在等待分裂的索引块。

为什么enq: TX - index contension总是发生在顺序插入的字段上?
虽然55分裂和91分裂在真实场景都是由可能的,但是enq: TX - index contension等待经常发生在91分裂的情况。因为序列、时间等字段上一般会有索引,并且经常发生顺序插入,此时最后侧的块一直都是热点块,后续的插入一直等待分裂块完成才能插入进去,此时便造成了enq: TX - index contension。UUID上一般也有索引,为什么没有造成enq: TX - index contension等待?因为UUID索引存在无序性,插入导致UUID索引分裂,也很难有后续插入的UUID值刚好也在这个分裂的索引块上。所以UUID是有索引分裂但不会形成enq等待队列从而出现enq: TX - index contension的情况。

解决办法

注意我们要解决的是索引分裂等待enq: TX - index contension,而不是索引分裂本身。解决办法:
1.反序索引
索引顺序的存放键值,反序索引刚好相反。例如一个’1111 0001’一串数字,正序索引会将它排在’0000 0002’后面;如果是反序索引,它排在’0000 0002’前面。想象一下时间字段,本身是最右热点,反序后秒、分、时排序在前,一个索引块可能包含不同月的同一秒数据,这样最右热点块基本不存在了,反序索引可以将热点打散到索引各个块上。
局限性:需要改造索引;可能无法使用索引范围扫描。顺序增长的字段,无法用到索引范围扫描,例如时间字段。某些场景下的反序键值有可能用到,需要具体分析。
语法

CREATE INDEX reveridx ON tablzl (name) REVERSE;

2.hash分区索引
在普通表上创建hash分区索引,相当于表不变、把索引分区,这样最右的热点块打撒到各个分区上。比如建立一个8分区的hash分区索引,将索引分成8个segment,最右热点有8个,减缓了索引分裂问题
局限性:需要改造索引;会影响索引范围查询的性能,需要抉择插入热点和查询效率问题。
等值和IN可以高效使用hash分区索引,官方文档原文:

Queries involving equality and IN predicates on index partitioning key can efficiently use global hash partitioned index to answer queries quickly

但是范围查找的效率会下降,分区越多下降越多(分区越多热点缓解越明显),这显然是一个平衡选择性问题。经测试,分区8个,范围查找逻辑读提升也接近8倍。分区后在每个分区内索引仍然是有序的,聚簇因子差别不大,扫描索引的代价差别不大,但是回表的代价加大。如果普通索引一个块内有8条数据指向1个数据块,会造成1次逻辑读,hash后分别存放在8个分区,每个分区1个索引块,会造成8次逻辑读。这就是范围扫描索引性能下降的原因。
语法

CREATE INDEX cust_last_name_ix ON customers (cust_last_name)GLOBAL PARTITION BY HASH (cust_last_name)PARTITIONS 4;

3.利用分区将索引打散
可以将表分区,创建本地索引从而达到打散最右热点的效果
局限性:分区键不能是索引字段(如果是索引字段就没有意义了);需要改造表;如果有SQL本身有分区字段,不会影响范围扫描的效率

4.降低并发
降低并发是终极武器。索引分裂等待本质就是并发太高了,如果没有几十个以上的并发插入一般都不会有索引分裂等待。

5.修改索引块大小
将索引块存放在16、32K的表空间中。这种情况理论上确实会有用,因为索引能存放的的数据更多了,分裂的情况就更少了。不过需要测试其性能,可能还有其他参数需要调整。

6.删掉索引
删除索引也是一个思路。根据业务情况,如果这个索引不重要可以把索引删掉;或者范围查询大小来做分区表,利用分区进行过滤而不是索引

这些情况为什么没用???

  • 增加ITL事务槽
    索引块的事务槽也可能因为高并发而不够用,确实于索引分裂的情况有些相似,但是其等待为enq: TX - allocate ITL entry。如果有这个等待,能分析到是索引块的,就说明索引上有较高的并发,同样可以用反序索引、hash分区索引来缓解问题,也可考虑修改initrans来解决问题。不过这两个等待的根因还是不同的,索引分裂不一定会伴随事务槽问题。
  • 调整索引块PCT_FREE
    PCTFREE表示一个数据块可用空间小于PCTFREE时,该数据块不在被记录在FREELIST中,即不能插入新数据。考虑两种情况:增加PCTFREE和减少PCTFREE。增加PCTFREE只能加剧索引分裂;减少PCTFREE看上去有效果,原理跟调整索引块大小类似,但是真实场景中PCTFREE默认是10%,已经很难再调小了,调整的效果不会很明显。
  • 重建索引减少碎片率
    这其实没什么关系,它没有解决最右热点块的问题。

参考

https://blog.csdn.net/lihuarongaini/article/details/101299328
https://docs.oracle.com/cd/E11882_01/server.112/e41573/data_acc.htm#PFGRF94786

鸣谢:豪桑、用哥

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

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

相关文章

③matlab向量和矩阵

目录 手动输入数组 创建等间距向量 数组创建函数 手动输入数组 1.背景 单个称为标量的数值实际上是一个 11 数组,也即它包含 1 行 1 列。 任务 创建一个名为 x 并且值为 4 的变量。 2.您可以使用方括号创建包含多个元素的数组。 x [3 5] x 3 5 任务 …

华为云Stack的学习(二)

三、华为云Stack产品组件 FunsionSphere CPS 提供云平台的基础管理和业务资源(包括计算资源和存储资源)。采用物理服务器方式部署在管理节点。可以做集群的配置,扩容和运维管理。 Service OM 提供云服务的运维能力,采用虚拟化方…

数字孪生:重塑制造、医疗和能源等领域的未来

数字孪生技术,作为虚拟仿真的重要领域,正以其强大的能力在各个行业中创造前所未有的创新。本文带大家一起深入探讨数字孪生技术在不同领域的广泛应用场景,展示其在实现效率、可靠性和智能化方面的积极影响。 制造业与工业领域 数字孪生技术在…

MyBatis分页插件PageHelper的使用及MyBatis的特殊符号---详细介绍

一,分页的概念 分页是一种将大量数据或内容分割成多个页面以便逐页显示的方式。在分页中,数据被分割成一定数量的页,每页显示一部分数据或内容,用户可以通过翻页或跳分页是一种将大量数据或内容分割成多个页面以便逐页显示的方式。…

JavaScript—DOM(文档对象模型)

目录 DOM是什么? DOM有什么作用? 一、事件 理解事件 事件怎么写(要做什么就写什么)? 实战演练 1、页面加载完毕以后,打印一句话 2、如果有一个a标签,并给其添加一个点击事件 3、事件默…

1、监测数据采集物联网应用开发步骤(1)

项目介绍 本文章编写目的针对下图中《。。。解决方案》所涉及的开发资料; 监测数据采集物联网应用解决方案_yong427的博客-CSDN博客 开发步骤实现从0开始搭建软件框架,该开发步骤基于python3.0语言及相关工具实现,阅读本文章之前请先初步百…

特斯拉启动墨西哥建厂计划,引发台厂竞逐 | 百能云芯

特斯拉(Tesla)在墨西哥新工厂计划备受瞩目,据外媒报道,墨西哥的超级工厂似乎正在迈出实质性的步伐。包括鸿海集团、广达(Foxconn)、和大在墨西哥和美墨边境都计划扩大电动车零配件生产基地。 市场对特斯拉在…

LeetCode-406-根据身高重建队列

题目描述: 假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。 请你重新构造…

MySQL中的free链表,flush链表,LRU链表

一、free链表 1、概述 free链表是一个双向链表数据结构,这个free链表里,每个节点就是一个空闲的缓存页的描述数据块的地址,也就是说,只要你一个缓存页是空闲的,那么他的描述数据块就会被放入这个free链表中。 刚开始数…

Markdown 扩展语法练习

风无痕 August 26, 2023 Markdown 指南中文版 Markdown 入门指南Markdown 基本语法Markdown 扩展语法Markdown 基本语法练习Markdown 扩展语法练习 代码 <h3 id"table">表格</h3>| Syntax | Description | | --- | --- | | Header | Title | | Paragrap…

【高阶数据结构】map和set的介绍和使用 {关联式容器;键值对;map和set;multimap和multiset;OJ练习}

map和set的介绍和使用 一、关联式容器 关联式容器和序列式容器是C STL中的两种不同类型的容器。 关联式容器是基于键值对的容器&#xff0c;其中每个元素都有一个唯一的键值&#xff0c;可以通过键值来访问元素。关联式容器包括set、multiset、map和multimap。 序列式容器是…

单核cpu是怎么处理多线程的

首先&#xff0c;要先了解几个概念&#xff1a; 1、线程是CPU调度和分配的基本单位。 2、进程是操作系统进行资源分配&#xff08;包括cpu、内存、磁盘IO等&#xff09;的最小单位 。 3、一个进程可以包括多个线程。 4、CPU的时间片是由计算机的操作系统OS里的调度器分配的. …

NFTScan | 08.21~08.27 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。周期&#xff1a;2023.08.21~ 2023.08.27 NFT Hot News 01/ NFT 品牌体验平台 Recur 将于 11 月 16 日彻底关闭&#xff0c;此前曾获 5000 万美元融资 8 月 21 日&#xff0c;NFT 品牌体验平台 Recur 在 X…

Oracle创建控制列表ACL(Access Control List)

Oracle创建控制列表ACL&#xff08;Access Control List&#xff09; Oracle ACL简介一、先登陆163邮箱设置开启SMTP。二、Oracle ACL控制列表处理&#xff08;一&#xff09;创建ACL&#xff08;create_acl&#xff09;&#xff08;二&#xff09;添加ACL权限&#xff08;add_…

【算法专题突破】双指针 - 盛最多水的容器(4)

目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后&#xff1a; 1. 题目解析 题目链接&#xff1a;11. 盛最多水的容器 - 力扣&#xff08;Leetcode&#xff09; 这道题目也不难理解&#xff0c; 两边的柱子的盛水量是根据短的那边的柱子决定的&#xff0c; 而盛水量…

开源项目的测试和质量保证

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

世纪互联收入增长放缓,低于华尔街预期,全年业绩指引令投资者失望

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 全年业绩指引令投资者失望 世纪互联&#xff08;VNET&#xff09;在发布了第二季度喜忧参半的财务业绩后&#xff0c;依然坚持了此前发布的2023财年业绩指引。 财报显示&#xff0c;虽然世纪互联第二季度的收入同比增长了6…

13、Vue3 大事件管理系统

一、大事件项目介绍 和 创建 1.1 Vue3 大事件管理系统 在线演示&#xff1a; https://fe-bigevent-web.itheima.net/login 接口文档: https://apifox.com/apidoc/shared-26c67aee-0233-4d23-aab7-08448fdf95ff/api-93850835 基地址&#xff1a; http://big-event-vue-api-t.i…

ardupilot开发 --- EKF篇

状态估计的算法发展 参数调试 AHRS_EKF_USE: set to “1” to use the EKF, “0” to use DCM for attitude control and inertial nav (Copter-3.2.1) or ahrs dead reckoning (Plane) for position control. In Copter-3.3 (and higher) this parameter is forced to “1” …

搭建 Gitlab

当设置和配置 GitLab 实例并执行诸如创建群组、项目、用户和上传代码等操作时&#xff0c;涉及到多个步骤&#xff0c;每个步骤都有特定的目的。让我们逐步解释每个步骤并说明其背后的原因&#xff1a; 安装必需的软件&#xff1a; yum install -y curl policycoreutils-python…