重庆oracle认证培训机构

新闻分类

产品分类

热门关键词

联系我们

企业名称:重庆科禄德科技有限公司

联系人:冷老师

手机:17754917523

邮箱:93865813@qq.com

网址:www.cqora.com

地址:重庆石桥铺高创锦业

Oracle数据库突然出现性能问题如何解决

您的当前位置: 首 页 >> 新闻资讯 >> 行业新闻

Oracle数据库突然出现性能问题如何解决

发布日期:2021-06-11 作者: 点击:

Oracle数据库突然出现性能问题,谁来承担

数据库突然出现的性能问题可以通过重启应用程序、重新收集统计信息、重启数据库等方式暂时解决。但是,如何找到失败的根本原因,避免失败的再次发生,是问题得到完美闭环的关键一步(当然,也是快速恢复业务的关键环节)。这也是很多行业(如金融、通信、铁路、航空等)的数据库系统的主要原因之一。)要求非常高的业务稳定性,购买甲骨文售后服务(ACS)中的顶级服务SSC服务。

根本原因分析的另一个重要性是找到问题的责任方:运维、开发或数据库产品本身(缺陷或bug)。有些问题是单方面的问题,有些可能有几个方面。根本原因分析的结论会影响部门的考核,一个大家都信服的结论可以说服后座议员。有时候让产品跌回锅里才是更好的结局。

我在网上看到一些关于分享故障排除的文章。虽然问题已经解决,但是根本原因分析的结论完全错误。比如有一个结论是索引唯一扫描的效率远远大于索引范围扫描,这就把一个数据库直方图的局限性解释为索引扫描模式的问题,是低级错误,误导了受众。

今天介绍的案例是一个学生发来的,让我对一个银行系统的SQL执行计划突然变更导致的性能问题做根本原因分析。我花了大概半个小时分析问题,给出根本原因。

问题描述:

2019年11月21日零时左右,某重要业务的SQL执行计划发生变化,执行效率严重下降。以下是收集的sqlhc信息(数据库版本11.2.0.4):

从上图的信息可以看出,执行计划的成本降低了,但效率却降低了几千倍。

对于有经验的优化专家来说,对这个问题的第一反应是谓词越界了。按照这个思路,我们可以很快得到证据(客户认为信息比较敏感,这里不贴太多细节)并给出根本原因。

根本原因分析:

1.根据该表的统计信息采集历史,11月20日晚,数据库对该表进行了自动统计信息采集。知识点1:每天22:00-02:00的工作日内,系统会为需要再次收集统计信息的表格收集统计信息。

2.知识点2:统计信息收集完毕后,使用此表的相关SQL会被硬解析。

3.知识点3:硬解析时会出现绑定变量偷窥。如果窥视的绑定变量超过字段统计信息的大值和小值(通常是大值)范围,则可能发生谓词冲突。如果谓词越界,可能会出现索引选择错误,导致执行计划效率低下。

4.知识点4:真正的谓词交叉通常发生在varchar2和number字段。虽然日期字段经常越界,但是系统对日期类型字段的穿越算法有一定的容忍度,不会认为是真正的穿越。存储在此sql越界字段中的数据是日期数据,但使用的是数字类型。这涉及到一个重要的开发规范:不建议使用number或varchar2类型保存日期数据,标准做法是使用date类型。以上数据类型的随意使用是开发者少敲几个字母的偷懒行为。因为按日查询时,日期类型一般需要写两个范围条件,而number或varchar2类型可以用一个等价条件完成,不需要to_date转换。这种懒惰不规范的做法,会给SQL性能带来很大的隐患。

5.知识点5:谓词越界后,数据库优化器在评估该sql可以使用的两个索引(都是以越界字段开始的复合索引)时,不是常规的选择方法,而是叶块较少的方法。在这种情况下,叶块较少的索引恰好是低效的索引。

下图显示了正常执行计划中使用的高效索引,sql使用了索引的所有三个字段;以下是执行计划在性能失败时使用的低效索引。sql只使用JYRQ的一个字段(数字类型保存日期数据):

6.知识点6: sql  HC捕捉到了sql背后的一些执行情况,使用的很多绑定变量不再越界,系统的自适应游标(ACS)保持开放。为什么ACS不能及时将执行计划调整回正常?还涉及到另一个不标准的情况:绑定变量使用的数据类型是char,而刚才我们提到字段使用的类型是number,所以优化器需要做to_number到绑定变量的隐式转换,使得ACS无效。

7.知识点7:网上很多文章都说ACS应该关闭,但我不太赞同这种说法。这种情况下,虽然ACS因为绑定变量类型不匹配而没有生效,但是如果绑定变量使用的数据类型也是number,ACS就会生效,也就不会出现执行计划一直出错的情况。对于谓词没有越界的情况,ACS可以及时调整回正常的执行计划。11g发布引入了ACS,开始的时候有很多bug。到11204版本,已经修复了很多bug,效果远远高于bug带来的一些小问题。

总结:

通过以上分析,很明显,造成这个问题的根本原因是开发人员使用不合适的数据类型保存日期数据,容易导致谓词交叉;同时使用了错误的绑定变量数据类型,使得优化器的ACS函数无效。这个锅应该完全由开发商来扛。但如果运维人员不掌握以上知识点,无法分析根本原因,那么性能故障的锅就只能自己背了。

如果这个sql是在没有代码调整的情况下开发的,同样的错误可能还会再次发生。解决方法是首先使用sql概要文件绑定来执行计划。


本文网址:http://www.cqora.com/news/798.html

关键词:Oracle认证培训,Oracle认证培训机构,Oracle认证培训中心

最近浏览:

报名咨询

点击咨询报名

QQ群

赛烽达技术群

冷老师

17754917523

加微信咨询

张老师微信.jpg

93865813@qq.com