作者:韩涛
文章来自微信公众号:平台人生
金庸说:有人的地方就有江湖;我说:有ORACLE的地方才是我们的江湖。与ORACLE斗争的故事历来有之,不少前辈也是以一人之力,挽狂澜于既倒,扶大厦之将倾,一战成名。作为我们团队中的一名DBA,深知这个行当的确是危机四伏,每天都必须做好和ORACLE进行生死对决的准备。挑战总是转瞬及至,我们总是不能放松的,今天我就来分享一次我们的团队遇到的一则生产案例,看看到底鹿死谁手!
早上才到工位,就看到手机上收到了一条DB主机CPU资源利用率高的告警信息,看来ORACLE又发起挑战了,马上投入战斗。战斗的第一步就是找到对手,登陆数据库发现库中大部分活动会话都在执行一条查询语句,数量居然高达几十个。很明显,问题就是出在这个查询语句上。能够快速定位到问题算是先胜一筹了。有了目标,接下来就是向对手发起精确打击,首先分析SQL语句及执行计划。
图一 SQL执行计划
逻辑非常简单的一条语句,为何会突然堵塞呢?从执行计中可以看到对T_PART进行了某几个分区的全分区扫描,这点很可疑,马上去查看T_PART表大小,发现T_PART表的每个分区大约10G左右,要扫描若干个如此大的分区,难怪会造成阻塞了,同时可以推测这条SQL的执行计划应该在近期改变过,否则问题肯定早就暴露了,为了验证这个猜测,马上查看了该SQL的历史执行情况和历史的执行计划、该表上的索引情况,果然在早上9:00-9:30之间,执行计划由通过IND_LOCAL索引检索,变为了当前的全分区扫描;逻辑读,物理读等也由个位数暴涨到一千左右。
图二 SQL历史执行情况
现在问题的发展相对清晰了,由于某种原因导致了SQL执行计划从走索引改变为全分区扫描,SQL执行时间变长,最后造成了业务阻塞。那么会影响SQL执行计划改变的原因都有哪些方面呢?
通过列举有可能产生问题的原因,仅发现分区索引方面有异常,那么问题来了,既然IND_LOCAL是本地索引,理论上来说每个分区之间应该是互不影响的。不管那么多,在没有其他思路之前,还是第一时间把问题索引重建了。然后新上的SQL执行计划就正常了!!!看来造成执行计划改变的原因的确是T_RANGE_P3分区上的索引失效;难道ORACLE之前鼓吹的分区表的各种好处都是逗我的吗……为了揭开事实的真相,看来我们要真刀真枪的大干一场了。
通过分析,问题的原因和触发场景基本已经清楚了。虽然最终还是解决了问题,但还是花费了较多的时间。对于分区表的本地索引,虽然在原理上某一个分区索引失效不会影响其他分区,但对于一些特殊情况,比如这次的事件中,分区键的值是通过一个子查询结果来获取的,导致优化器不能确定分区扫描的范围,在本地索引中某个分区失效的极端情况下,优化器将直接认为相关本地索引为不可用状态,造成执行计划改变的严重后果。看来我们不光要多多学习ORACLE的新技术,对已有的成熟技术也是不能放松的,本期分享就到这里了,下期我们就来深入挖掘一下索引失效的问题,看看强壮的本地索引到底存在着哪些软肋呢?
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞2
添加新评论0 条评论