数据库管理-第174期 执行计划的改变竟如此复杂(20240423)

数据库管理174期 2024-04-23

  • 数据库管理-第174期 执行计划的改变竟如此复杂(20240423)
    • 1 大量等待
    • 2 性能问题排查
    • 3 为什么执行计划会改变
      • 3.1 统计信息不准确
      • 3.2 表数据量过大
      • 3.3 错误索引
    • 4 优化建议
    • 总结

数据库管理-第174期 执行计划的改变竟如此复杂(20240423)

作者:胖头鱼的鱼缸(尹海文)
Oracle ACE Associate: Database(Oracle与MySQL)
PostgreSQL ACE Partner
国内某科技公司 DBA总监
10年数据库行业经验,现主要从事数据库服务工作
拥有OCM 11g/12c/19c、MySQL 8.0 OCP、Exadata、CDP等认证
墨天轮MVP、认证技术专家、年度墨力之星,ITPUB认证专家、专家百人团成员,OCM讲师,PolarDB开源社区技术顾问,OceanBase观察团成员
圈内拥有“总监”、“保安”、“国产数据库最大敌人”等称号,非著名社恐(社交恐怖分子)
公众号:胖头鱼的鱼缸;CSDN:胖头鱼的鱼缸(尹海文);墨天轮:胖头鱼的鱼缸;ITPUB:yhw1809。
除授权转载并标明出处外,均为“非法”抄袭

本期源自于上周一晚上11点过处理的一个性能问题,一体机上的一个PDB突然出现了大量的等待,且看问题是如何处理并如何分析的。

1 大量等待

在我维护Oracle的历史中,latch: cache buffer chains是出现过很多次的,有因为BUG出现的、也有因为一些操作触发的、还有因为数据库配置异常导致的。
本次的异常语句大致如下:

select count(*) from tabX where A=:1 and B=:2;
select * from (select A,B,C,D,E... from tabX where A=:1 and B=:2) where rownum<3;

这两条语句查询的是相同的表,从业务逻辑来看,两条语句有关联性,查询过滤调价你的列也想通。
故障时段通过SQL_ID批量kill对应session,但是等待仍然无法下降(众所周知,latch锁不是太好解决),因此和业务方沟通,快速重启了该PDB,并对这张表重新收集了统计信息:

alter pluggable dataabse close immediate instances=all;
alter pluggable database open instances=all;
exec dbms_stats.gather_table_stats(ownname=>'USERX',tabname=>'TABX',cascade=>true,degree=>16);

然后启动service:

srvctl start service -db dbaas -s Xservice

这时应用侧再处理其他问题,同时检查语句执行情况,恢复正常。

2 性能问题排查

首先,按照习惯重新收集了统计信息,那么首先排查执行计划,这里可以通过下面的语句来收集对应时段的SQL执行计划(How to Determine the Execution Plan for a SQL Statement for a Range of AWR snapshots? ( Doc ID 795204.1 )):

@?/rdbms/admin/awrsqrpt.sql
-- 这里需要在对应实例执行
-- 和生成AWR报表一样需要输入时段对应的快照编号
-- 需要输入对应的SQL_ID

由于涉及生产系统,这里不便展示,但是结论就是,正常时段,两条语句执行计划走的是A列的索引IDX_A,而异常时段走的确实B列上的索引IDX_B。
这是SR也反馈,这两条语句在半小时的IO(主要是buffer get)也超过了6TB,而平时的IO则很小,回去看看表的数据量:

select count(*) from tabX;COUNT(*)
----------
117281393

这个表的实际数据量超过了1.17亿,同时该表为分区,你没有看错,没有分区!
同时与业务方一起对表数据进行检视,发现A列数据基本上都是唯一的,而B列数据存在大量重复内容。这两条语句也是大部分业务操作的前置操作,因此并发量不小。
那么执行计划异常走到了IDX_B是导致本次问题的主要原因,由于IDX_B选择性较低,走这个索引效率就会比较低,大概率还会回表扫描引起较大的IO。

3 为什么执行计划会改变

其实这次故障客户最大的疑问就是日常运行正常,突然除了问题,处突完成后又正常了,其实执行计划变更下面几个原因:

3.1 统计信息不准确

在这次处突过程中,做了重新收集统计信息的操作,统计信息和执行计划生成又是强相关的,那么如果统计信息不准确肯定可能造成执行计划不准确。19c开始统计信息收集是不需要添加过多参数,会自动判断是否需要收集额外的统计信息,比如多列、直方图、索引等等,并自动选择采样比例;自动统计信息收集也会选择收集频率。但是如果表数据十分复杂,且如果采样的内容不合理也可能出现一些问题。
但是本次很奇怪,11点过出现问题,不在自动统计信息的维护窗口内,应该不是新收集的统计信息引起的问题,那么我们姑且先把统计信息不准确放在这。

3.2 表数据量过大

单表数据量过大,且没有分区会造成需要在磁盘和内存之间交互的数据量增大,影响IO。这次对应的表数据量大且没有分区,语句走了错误的索引造成大量IO。这可以算是错误执行计划引起了错误的结果了。当然数据量过大也增大了统计信息准确收集的难度。

3.3 错误索引

众所周知,索引的适用场景是从大量数据中获取少量数据,并不适合获取较多的数据,也就不适合用在重复值较多的列上。在本次问题中,涉及的两个列都建了独立的索引,相当于给优化器说,我给了你两条路选择,当统计信息不准确、表数据量较大和其他一些问题的时候,给了优化器一个“幻觉”,让它走了第二条路,生成了错误的执行计划。而且不合理的索引也增加了统计信息收集准确的难度。

4 优化建议

  1. 干掉不合理的索引,让优化器没有走错路的可能性(提升统计信息准确程度)(如果无法干掉,则使用hint指定索引或SPM固定执行计划)/或者以合适列为引导列建立合适的复合索引
  2. 控制表的数量,尽量分区,减少出现大IO的可能性(提升统计信息准确程度)
  3. 如果表内数据变化较大,可以在自动维护窗口外,业务压力较小的时候增加手动统计信息收集
  4. 针对本次问题的具体语句,在没有必要的情况下使用子查询,有可能对临时表空间容量带来压力(本次未发生),为了避免该问题发生,根本解决方案是干掉子查询,由于应用无法改动,只能先增加临时表空间

总结

数据库的问题其实大多数还是源自于应用程序设计和数据库逻辑设计层面。
老规矩,知道写了些啥。

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

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

相关文章

【QML】State组件

State(状态)组件是一组来自默认配置的批处理更改。所有项都有一个默认状态&#xff0c;该状态定义对象和属性值的默认配置。可以通过将State项添加到states属性来定义新的状态&#xff0c;以允许项在不同的配置之间切换。 State组件的基本用法如下&#xff1a; Window {id: …

在Linux中,按上下左右键为什么变成^[[A^[[B^[[C^[[D

在Linux中&#xff0c;当你按下键盘上的箭头键时&#xff0c;通常会发送相应的转义序列给终端。这些转义序列告诉终端程序如何解释按键的含义。例如&#xff0c;按下箭头键时&#xff0c;可能会发送类似于^[[A、^[[B、^[[C、^[[D这样的序列。 这些序列的开头^[[实际上是转义字…

终端安全加强

1. 加强密码管理 对于重要数据和系统&#xff0c;必须采用复杂的密码进行保护&#xff0c;并定期更换密码。同时&#xff0c;要加强对员工密码的管理&#xff0c;确保每个员工有一个独立的账号和密码&#xff0c;并限制其使用权限。 2. 实施访问控制 对于终端设备的访问要进…

gitea是什么,与gitlab和github对比有什么特点

Gitea是一个轻量级的DevOps平台软件&#xff0c;它支持Git托管、代码审查、团队协作、软件包注册和CI/CD等功能。与GitHub和GitLab相比&#xff0c;Gitea的一个显著特点是它提供了自托管的能力&#xff0c;这意味着用户可以完全控制自己的仓库和基础设施&#xff0c;而不需要依…

【ARM Trace32(劳特巴赫) 使用介绍 12.1 -- Trace32 读写 64位地址】

请阅读【Trace32 ARM 专栏导读】 文章目录 Trace32 读写 64位地址读 64 位地址写64位地址Trace32 读写 64位地址 在使用TRACE32进行调试时,有时需要读取或操作64位的地址,特别是在处理64位的处理器或操作系统时。以下是如何在TRACE32中读取64位地址的一般方法。 读 64 位地…

MySQL行级锁——技术深度+1

引言 本文是对MySQL行级锁的学习&#xff0c;MySQL一直停留在会用的阶段&#xff0c;需要弄清楚锁和事务的原理并DEBUG查看。 PS:本文涉及到的表结构均可从https://github.com/WeiXiao-Hyy/blog中获取&#xff0c;欢迎Star&#xff01; MySQL行级锁 行级锁&#xff08;Row-…

hbase基础(三)

HBase第三天 HBase的读流程 客户端拿到一个rowkey&#xff08;首先得要知道这个rowkey存在哪个region中&#xff09;根据zk获取hbase:meta表&#xff0c;这个表中存放了region的信息&#xff0c;根据namespace、表名&#xff0c;就可以根据rowkey查看是否匹配某个region的sta…

体验升级:Shokz韶音OpenRun Pro运动耳机全面评测

在最新的产品评测中&#xff0c;我们关注了一款备受期待的运动耳机&#xff1a;基普乔格联名款Shokz韶音OpenRun Pro。这款由京东配送的耳机迅速到达并接受了我们的审查&#xff0c;旨在评估其独特的功能和性能。 音质始终是衡量耳机优劣的关键指标。韶音品牌在运动耳机行业享…

Command SwiftCompile failed with a nonzero exit code

Command SwiftCompile failed with a nonzero exit code 记录一下这个错误的一个解决方案 Xcode15.3 新建项目后 使用cocoapods&#xff0c;pod引入第三方库后报Command SwiftCompile failed with a nonzero exit code 的错误 解决方法 Target - build setting - 搜索sandbo…

爬虫ip下载

爬虫IP下载是指获取用于爬取网页数据的代理IP地址的过程。通过使用代理IP&#xff0c;可以隐藏真实的访问者IP地址&#xff0c;提高爬虫的稳定性和安全性。 通常&#xff0c;爬虫IP下载可以通过以下几种方式进行&#xff1a; 免费代理IP网站&#xff1a;有一些网站提供免费的代…

js连接抖音打印组件实现打印

js连接抖音打印组件实现打印小票 安装抖音打印组件 抖音打印组件文档&#xff1a; https://bytedance.larkoffice.com/docs/doccn2vbOOdd3KWrCd6Z93nIlvg 跟着文档案例一步步配基本上没问题&#xff0c; 打印的时候需要设置下打印机名称 export class DouyinPrint {construct…

C++11新特性 - override and final

override 关键字的应用 保证在派生类中声明的重载函数&#xff0c;与基类的虚函数有相同的签名为了减少程序运行时的错误&#xff0c;重写的虚函数都建议加上 override示例 class Base { public:virtual void Show(int x); // 虚函数 };class Derived : public Base { public…

怎么理解算力?1000P算力是什么概念?

算力&#xff0c;指计算机系统在单位时间内能够完成的计算任务量&#xff0c;它涵盖了CPU、GPU、TPU等硬件&#xff0c;每秒能处理的数据量&#xff0c;通常以“P”&#xff08;PetaFLOPS&#xff0c;即千万亿次浮点运算每秒&#xff09;为单位来衡量&#xff0c;是评估计算机性…

PDF被加密无法打印的解决办法

思路很清晰&#xff1a;先解密→再打印 分享四个工具&#xff0c;可以轻松解密PDF&#xff1a; ⭐i love pdf I LOVE PDF是一款免费的PDF网站&#xff0c;界面设计简洁&#xff0c;首页没有广告&#xff0c;但每个功能的操作界面是有广告的&#xff0c;不会影响使用。 部分功…

大数据开发详解

点击下载《大数据开发详解》 1. 前言 随着信息化时代的快速发展&#xff0c;大数据已经成为了企业和组织不可或缺的重要资源。大数据开发则是指通过一系列技术手段&#xff0c;对海量数据进行收集、存储、处理、分析和挖掘&#xff0c;以实现数据的价值化利用。大数据开发涉及…

byte十六进制转换读卡

需求&#xff1a;将一串十六进制字符串&#xff0c;弄成十进制 1.截取特定位数的字符串&#xff0c;比如去除 前面的标识符和后面的校验码&#xff0c;只需要中间部分 2.拿到十六进制字符串 3.将十六进制字符串转成byte 字节数组 4.调换字节数组的顺序&#xff0c; 4.将新字节数…

剑指offer--调整数字顺序使奇数位于偶数前面

题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有的偶数位于数组的后半部分. 算法分析 算法:利用快速排序的一次划分思想&#xff0c;后面的奇数往前移&#xff0c;前面的偶数往后移 时间复杂度 &#xff1a;O(n) 空间…

垃圾渗滤液如何有效处理

垃圾渗滤液&#xff0c;通常称为垃圾填埋场的渗滤液&#xff0c;是一种复杂的高浓度有机废水&#xff0c;含有多种有毒有害物质。有效处理垃圾渗滤液对环境保护至关重要。这里是一些常见且有效的处理方法&#xff1a; ### 预处理 ##### 1. 调节池 - **pH调整**&#xff1a;通过…

JavaWeb开发06-原理-Spring配置优先级-Bean管理-SpringBoot原理-Maven继承和聚合-私服

一、Spring配置优先级 不同配置文件&#xff0c;配置同一个属性谁有效 properties>yml>yaml 命令行参数>Java系统属性 项目打包后要改变属性&#xff1a; 红色是Java系统属性&#xff0c;绿色是命令行参数 ‘ 二、Bean管理 1.获取bean 获取IOC容器&#xff1a;ap…

中国1KM降水侵蚀因子R(2000-2022)

降雨侵蚀力因子其实是用来描述降雨对土壤侵蚀的潜在能力大小的&#xff0c;就是降雨的冲刷对土壤的侵蚀效应。 到降雨侵蚀力因子R的计算方法非常的繁多&#xff0c;不过这些计算方法总结下来&#xff0c;核心思路其实大概可以分为两种&#xff1a;一种是将降雨的动能引入模型来…