一条update语句的优化探索(r9笔记第80天)

今天经开发同学反馈,发现有一些update语句阻塞了部分业务流程,为什么说一些而不是一条,是因为这些update语句都在一个存储过程中,语句结构相仿,真有一种一荣俱荣,一损俱损的感觉。而比较纠结的是这样的update语句有差不多10个。从我收到反馈到观察分析,里面的第一条update语句运行了近5个小时,还没有完成,从SQL Monitor的报告来看,似乎进度甚微,按照这个进度,这些语句的执行时间会非常惊人。

我先拿到了一个初步的报告。

概览信息如下:一条update语句的优化探索(r9笔记第80天)

一条update语句的优化探索(r9笔记第80天)

一条update语句的优化探索(r9笔记第80天)

我们来看看语句:一条update语句的优化探索(r9笔记第80天)

vip_recharge_log对应的索引信息如下:

一条update语句的优化探索(r9笔记第80天)

时间跨度有多大呢,可以通过如下的表达式来得到一个时间范围。一条update语句的优化探索(r9笔记第80天)

所以初步的评估就是重构索引。目前的索引是根据时间字段或者根据id来创建索引,其实可以考虑复合索引,根据id,时间字段来过滤数据,成本相对要低很多。所以考虑创建一个新的索引  

CREATE INDEX "IDX_VIP_RECHARGE_MIX" ON "VIP_RECHARGE_LOG"

这样数据过滤的效果就会好很多。这个瓶颈能够化解了,其它的几个问题也就引刃而解。

所以在这种场景下,不修改SQL语句,调整索引就预估达到极大的性能提升。而对于此还是需要很谨慎的,我复制了表中的数据,在另外的环境进行了快速的复现,执行计划的效率大大提高。在这个基础上,考虑添加了并行,虽然会消耗服务器的资源,但是能够极大提高效率,这些付出也是合理的。在这些简单调整之后,再次测试运行语句,1分半钟就能够顺利完成。