如何解决索引分裂问题?

news2025/1/28 1:03:08

索引分裂

索引块快写满时就会发生索引分裂,索引分裂分为两种情况,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.coloradmin.cn/o/942150.html

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

相关文章

机器学习-神经网络(西瓜书)

神经网络 5.1 神经元模型 在生物神经网络中,神经元之间相互连接,当一个神经元受到的外界刺激足够大时,就会产生兴奋(称为"激活"),并将剩余的"刺激"向相邻的神经元传导。 神经元模型…

Cento7 Docker-compose安装RabbitMQ

RabbitMQ是一个消息中间件,是用Erlang语言编写的。RabbitMQ据说具有良好的性能和时效性,同时还能够非常好的支持集群和负载部署,非常适合在较大规模的分布式系统中使用。接下来我们就以docker形式安装。 1.先安装docker环境 yum -y install…

MATLAB算法实战应用案例精讲-【自然语言处理】语义分割模型-DeepLabV3

目录 1、DeepLab系列简介 1.1.DeepLabV1 1.1.1创新点: 1.1.2. 动机: 1.1.3. 应对策略: 1.2.DeepLabV2 1.2.1.创新点: 1.2.2.动机 1.2.3. 应对策略: 1.3.DeepLabV3 1.3.1创新点: 1.3.2. 动机&am…

【大魔王送书第一期】《一名阿里服务端开发工程师的进阶之路》

一、前言 目前,资讯、社交、游戏、消费、出行等丰富多彩的互联网应用已经渗透到了人们生活和工作的方方面面,正深刻改变着信息时代。随着用户规模的增长和应用复杂度的上升,服务端面临的技术挑战越来越严峻。在头部互联网企业,服…

Docker:Harbor 私有仓库迁移

Harbor 私有仓库迁移 一.私有仓库迁移的介绍 1.为何要对Harbor 私有仓库的迁移 (1)硬件升级或更换:如果源 Harbor 在旧的硬件设备上运行,并且计划将其迁移到新的硬件设备上,那么需要执行迁移操作。 (2&…

17万字集团大数据平台整体方案word

导读:原文《17万字集团大数据平台整体方案word》(获取来源见文尾),本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考。以下是部分内容, 1.1.1 总体目标 根据集团信…

第八章 贪心算法 part03 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果 (day34补)

本文章代码以c为例! 一、力扣第1005题:K 次取反后最大化的数组和 题目: 给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组: 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择…

【如何对公司网络进行限速?一个案例详解】

有不少朋友问到了关于企业网络QoS配置,这个确实在实际网络应用中非常多,基本上大部分企业或个人都用到这个功能,本期我们详细了解下QoS如何对宽带进行限制,QoS如何企业中应用。 一、什么是QoS? Qos是用来解决网络延迟和阻塞等问…

JavaScript—BOM

BOM是什么? Browser Object Model是浏览器对象模型 官方:浏览器对象模型提供了独立于内容的、可以与浏览器窗口进行互动的对象结构,BOM由多个对象构成,其中代表浏览器窗口的window对象是BOM的顶层对象,其他对象都是该…

SSM(Spring+SpringMVC+MyBatis)整合

目录 1、提出问题 2、解决问题 3、相关文件 1、提出问题 SSM(SpringSpringMVCMyBatis)的开发,MyBatis在没有与Spring和SpringMVC整合的时候,是单独使用,单独配置。 Spring和SpringMVC的整合是无缝衔接的&#xff0…

听力和阅读都是6.5分,写作和口语6分,最后评分会是多少分

听力和阅读都是6.5分,写作和口语6分,最后评分会是多少分 根据雅思评分标准,每个模块的分数将会被四舍五入到0.5分的精度。在你的情况下,如果听力和阅读都是6.5分,写作和口语都是6分,那么你的最终雅思总分将…

JVM下篇知识

第01章:概述篇 第02章:JVM监控及诊断工具-命令行篇 第03章:JVM监控及诊断工具-GUI篇 第04章:JVM运行时参数 第05章:分析GC日志

【腾讯云 TDSQL-C Serverless 产品测评】- 云原生时代的TDSQL-C MySQL数据库技术实践

一、活动介绍: “腾讯云 TDSQL-C 产品测评活动”是由腾讯云联合 CSDN 推出的针对数据库产品测评及产品体验活动,本次活动主要面向 TDSQL-C Serverless版本,初步的产品体验或针对TDSQL-C产品的自动弹性能力、自动启停能力、兼容性、安全、并发…

18.神奇导航菜单指示器

效果 源码 <!DOCTYPE html> <html> <head> <title>Magic Menu Indicator | 03</title> <link rel="stylesheet" type="text/css" href="style.css"> </head> <body><div class="navig…

时序预测 | MATLAB实现基于PSO-LSTM、LSTM时间序列预测对比

时序预测 | MATLAB实现基于PSO-LSTM、LSTM时间序列预测对比 目录 时序预测 | MATLAB实现基于PSO-LSTM、LSTM时间序列预测对比效果一览基本描述程序设计参考资料 效果一览 基本描述 MATLAB实现基于PSO-LSTM、LSTM时间序列预测。 1.Matlab实现PSO-LSTM和LSTM神经网络时间序列预测…

QT下使用ffmpeg+SDL实现音视频播放器,支持录像截图功能,提供源码分享与下载

前言&#xff1a; SDL是音视频播放和渲染的一个开源库&#xff0c;主要利用它进行视频渲染和音频播放。 SDL库下载路径&#xff1a;https://github.com/libsdl-org/SDL/releases/tag/release-2.26.3&#xff0c;我使用的是2.26.3版本&#xff0c;大家可以自行选择该版本或其他版…

【数据结构大全】你想要的都有,数组、链表、堆栈、二叉树、红黑树、B树、图......

目录 1.概述 2.线性结构 3.时间复杂度 4.查找算法 5.树 6.图 1.概述 博主之前写过一个完整的关于数据结构的系列文章&#xff0c;一共十三篇&#xff0c;内容包含&#xff0c;数组、链表、堆栈、队列、时间复杂度、顺序查找、二分查找、二叉树、二叉搜索树、平衡二叉树、…

【Android-Flutter】我的Flutter开发之旅

目录: 0、文档&#xff1a;1、在Windows上搭建Flutter开发环境&#xff08;1&#xff09;[使用中国镜像(❌详细看官方文档)](https://docs.flutter.dev/community/china)&#xff08;2&#xff09;[下载最新版Flutter SDK&#xff08;已包含Dart&#xff09;](https://docs.flu…

从项目中突显技能:在面试中讲述你的编程故事

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

华为数通方向HCIP-DataCom H12-821题库(单选题:141-160)

第141题 Router-LSA 能够描述不同的链路类型&#xff0c;不属于Router LSA 链路类型的是以下哪一项? A、Link Type 可以用来描述到末梢网络的连接&#xff0c;即 SubNet B、Link Type 可以用来描述到中转网络的连接&#xff0c;即 TranNet C、Link Type 可以用来描述到另一…