奇异故障:SQL执行反复一慢两快

何剑敏

Oracle ACS华南区售后团队,首席技术工程师。多年从事第一线的数据库运维工作,有丰富项目经验、维护经验和调优经验,专注于数据库的整体运维。

今天分享一则bug导致的SQL执行不稳定的案例。

SQL执行的时间,在正常情况下应该是稳定的。如果第一次快,第二次慢,那么可能就是由于cardinality feedback的缘故,我们可以设置”_OPTIMIZER_USE_FEEDBACK”= false来规避。但是这次遇到的问题却是执行过程两快一慢,执行过程是慢->快->快->慢->快->快->慢->快->快->……,执行了慢之后,还能再快回来,这是怎么回事呢?

这个sql初次执行的时候是快的,然后把这次快的执行计划用spm固定下来,再次执行的时候,就发生了慢快快的现象。

这些现象的原因,是hint中了oracle的2个bug,我用流程图显示如下:

稍微解释一下:

我们看到,一开始SQL发起的时候,由于cardinality feedback(CFB),且hint中Bug 14147762 Cardinality feedback causes worse plan for JPPD,(这也是通常Cardinality feedback产生第一次快后面慢的原因,可以禁用Cardinality feedback解决,但是我们不想禁用oracle的新特性,我们需要了解其中的root cause,找出解决办法),产生了坏的执行计划,后续,检查该sql语句是否在SQL Management Base(SMB)中,由于保存过搞语句及其执行计划,所以在smb中,再进一步检查执行计划是否在smb中,由于之前保存的是那个好的执行计划,因此该执行计划不在smb中。由于执行计划不在smb中,尝试reproduce,但是此时又hint中另外一个Bug 12980183 –SPM cannot reproduce execution plan(也是和语句中含有push join pred有关,因为含有JPPD,造成无法reproduce成功。其实这个bug也容易绕过,就是使用outline,不使用SPM。)。于是无法成功reproduce执行计划。无法成功reproduce原来的执行,oracle将reproduce标记为从YES改为NO,然后使用了坏的执行计划。——执行的慢。

然后我们继续跑该sql,由于reproduce状态改变,oracle重新继续解析,注意,此时CFB不会介入,在10053的trace中也可以看到没有CFB的介入,没有看到/*+ OPT_ESTIMATE */ 的hint。 此时由于没有没有CFB的介入,生成的执行计划是好的。继续检查该sql和sql的执行计划是否在SMB中,结果是语句确实在SMB中,执行计划也是在SMB中(因为是好的执行计划),将reproduce标记从NO改为YES,使用该好的执行计划,也是在SMB中的执行计划。——执行的快。

好了,我们继续跑第三次,再次由于reproduce状态改变,oracle重新解析,且CFB不介入。生成好的执行计划,继续检查该sql和sql的执行计划是否在SMB中,结果是语句确实在SMB中,执行计划也是在SMB中(因为是好的执行计划),注意,此时不需要改变reproduce的标记。然后使用该好的执行计划,所以,——执行的快。

继续执行第四次,由于之前reproduce标记未变,因此,CFB介入,此时hint中Bug 14147762,生成坏的执行计划,重复到了第一步的情况,因此出现了慢的情况。

在上述的解释中,我们基于下面的2个假设:

1. 当reproduce的状态发生的时候,CFB不介入。 2. sql的再次解析发生在: 1)reproduce status change 2)cardinality feedback take effect

最终的我们找到了一慢两快的原因,为上述的2个bug申请Patch解决(在11.2.0.3上的patch,到11.2.0.4上已经fix掉)。

----the end

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2016-09-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

深入解读MS14-068漏洞:微软精心策划的后门?

0x0 背景 初次认识该漏洞是在FreeBuf上对该漏洞的预警《漏洞预警:系统权限提升漏洞(CVE-2014-6324)影响全版本Windows服务器》: 微软...

2068
来自专栏沃趣科技

容器化 RDS:借助 CSI 扩展 Kubernetes 存储能力

RDS 并不是新生事物,新鲜的是通过容器技术和容器编排技术构建 RDS。对金融客户而言,他们有强烈拥抱 Docker 和 Kubernetes 的愿望,但可用性...

2243
来自专栏魏艾斯博客www.vpsss.net

搬瓦工如何续费、自动续费、提前续费、取消续费

2095
来自专栏FreeBuf

挖洞经验 | 看我如何发现“小火车托马斯”智能玩具APP聊天应用漏洞

最近,我向智能玩具厂商ToyTalk提交了两个APP相关的漏洞并获得了$1750美金奖励,目前,漏洞已被成功修复,在此我打算公开详细的漏洞发现过程,以便其他AP...

2257
来自专栏逸鹏说道

一个功能完备的.NET开源OpenID Connect/OAuth 2.0框架——IdentityServer3

今天推荐的是我一直以来都在关注的一个开源的OpenID Connect/OAuth 2.0服务框架——IdentityServer3。其支持完整的OpenID ...

30311
来自专栏魏艾斯博客www.vpsss.net

windows VPS 服务器安全防护软件

2653
来自专栏JetpropelledSnake

Python Web学习笔记之多道程序设计技术和操作系统的特性

采用了多道程序设计技术的操作系统具有如下特性 : ① 并发性。它 是指两个或两个以上的事件或活动在同一时间间隔内发生。操作系统是一个并发系统,并发性是它的重...

28512
来自专栏程序员的SOD蜜

PDF.NET 数据开发框架 许可限制 框架源码的获取

欢迎使用 PDF.NET 数据开发框架 (Ver 4.0) 关于框架的名字由来          在我设计www.pwmis.cn 站点(原域名已经过期,现在正...

1986
来自专栏散尽浮华

云计算和虚拟机基础梳理

云计算介绍 云计算是一种按使用量付费的模式,这种模式提供可用的、便捷的、按需的网络访问,进入可配置的计算资源共享池,(资源包括网络、服务器、存储、应用软件、服务...

4116
来自专栏EAWorld

Flannel+K8s容器网络通信实践

? 亲爱的各位朋友,大家好! 今天很高兴可以和大家分享我们普元云平台SEM使用kubernetes时,关于pod、service网络通讯的实践与大家分享。 以...

4178

扫码关注云+社区