奇异故障: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 条评论
登录 后参与评论

相关文章

来自专栏Google Dart

为Flutter应用程序添加交互性 顶

你如何修改你的应用程序,使其对用户输入做出反应? 在本教程中,您将为仅包含非交互式小部件的应用添加交互性。 具体来说,您将通过创建一个管理两个无状态小部件的自定...

892
来自专栏西枫里博客

JS控制批量选择/取消复选框

场景应用:在后台分页输出查询数据(如文章、评论),往往需要进行批量删除/审核等操作。后端程序需要读取操作的ID集合进行批量处理。而前端批量选择传入ID是最方便的...

631
来自专栏用户2442861的专栏

2014 360校园招聘技术类笔试题

原文:http://blog.csdn.net/lanxuezaipiao/article/details/41892553

521
来自专栏NetCore

复杂而艰辛的重构之路--起步

你有没有试过,当你踏入一个新的公司,看到了几千几万几十万代码的时候,那种崩溃的感觉? 代码多不可怕,怕的是代码的可读性、维护性、扩展性是如此之差,这时候该怎么办...

1809
来自专栏前端说吧

Js - JQ事件委托( 适用于给动态生成的脚本元素添加事件)

2605
来自专栏ThoughtWorks

TW洞见〡Ruby Web服务器:这十五年

文章作者来自:ThoughtWorks - 韩翼。 坦率的说,作为一门年轻的计算机语言,Ruby在最近二十年里的发展并不算慢。但如果与坐拥豪门的明星语言们相比,...

26810
来自专栏Java架构

京东Java架构师讲解购物车的原理及Java实现

1)用户没登陆用户名和密码,添加商品, 关闭浏览器再打开后 不登录用户名和密码 问:购物车商品还在吗? 

2265
来自专栏葡萄城控件技术团队

Visual Studio 2015速递(1)——C#6.0新特性怎么用

系列文章 Visual Studio 2015速递(1)——C#6.0新特性怎么用 Visual Studio 2015速递(2)——提升效率和质量(VS20...

1728
来自专栏Java呓语

适配器模式(转化匹配,复用功能)

如果您是第一次阅读我的设计模式系列文章,建议先阅读设计模式开篇,希望能得到您宝贵的建议。

684
来自专栏情情说

《深入实践Spring Boot》阅读笔记之一:基础应用开发

上上篇「1718总结与计划」中提到,18年要对部分项目拆分,进行服务化,并对代码进行重构。公司技术委员会也推荐使用spring boot,之前在各个技术网站中也...

3389

扫描关注云+社区