本文作者:老猫
关于SQL的问题,老猫最常遇见的就是让客户头大分析起来麻烦的性能问题,巴特,对于老猫这种作为长期支持各种客户的老司机,这根本不叫搞事情呀!
对客户而言,最怕遇到的就是trouble shooting有一定难度,原因还多样的wrong result了,因为目前的应用多数是web的,终端用户很分散,wrong result很难被发现,爱玩藏猫猫无所谓啦,但造成很严重的业务问题,就是wrong result的不对了!
今天,老猫就来与大家分享一下最近遇到的wrong result的案例,中间涉及10053 trace的简单解读、bug的查找以及最后给出相应的开发建议,快get起来!
自从干上第三方,平时忙的要死,周末还有团队的技术沙龙,不是听课就是讲东西。只有周六可以好好的睡个大懒觉。某周六正睡的好好的,被一阵电话铃声吵醒,“老猫,这边有条SQL,本来应该只返回一条记录,结果却返回了很多条记录,这是为什么呢?SQL已经发你邮箱了!”
问题就是集结号,老猫立刻就精神饱满的投入到问题分析的进程中了;
老猫带着疑惑打开邮件,果然是与我们合作已久的客户了,给出的信息都很全,首先关注具体的SQL语句,语句很简单易懂,经过简化脱敏后的SQL是这样的:
没错,wrong result就是这样,来无声去无息,它并没有具体的报错码,我们通常也不能一眼看出他的错误发生在哪一步了,这个时候如果是你,你会怎么接着往下分析呢?小小思考之后不如看看老猫如何获取解决问题的钥匙。
关于wrongresult:
通常来说,wrong result并不好判断,特别是当查询非常复杂时,通常我们是无法简单判断最后的结果应该是什么样的,所以是属于非常严重而且又隐蔽的一种报错;关于wrong result,MOS上有一篇比较实用的文章-《Wrong Results Issues - Recommended Actions (文档 ID 150895.1)》,其中列出了出现wrongresults的几种常见情况:
当遇到ORA-1795/ORA-1791/ORA-1722等错误时,可能需要注意,这些错误的背后根本原因就是wrong result了;
涉及到排序组合等操作时存在的wrong result;
涉及NULL值比较的时候存在的wrong result;
涉及并行操作的时候存在的wrong result;
同时,在文章中给出了几个可选的解决/规避方案,以及并给出oracle提供的诸如dbms_sqldiag包,SPM工具等都可以用来收集并协助判断问题;
对于相对来说简单的语句,以老猫的经验,倒是不必把它想的太过复杂了,我们可以先通过语句本身和结果集的特征来简单分析一下:
1.回想一下语句本身,是否存在不必要的冗余部分呢?上面的语句是否可以直接简化成如下呢?而简化以后是否还会出现wrong result呢?
2.从结果来看,针对语句,似乎只做了第一层group by,而没有做第二层group by;从语句的逻辑上看,做第二层group by的根本意义在于将cdate类型格式化月份进行统计,而结果本身确实有已经被格式化成月份了;如果说完全没有做第二层group by,那么似乎返回的结果可能就不是按月份来显示的了,而如果说做了第二层group by,那为什么结果又不对呢?到这里,问题变得有意思起来,是to_char函数改变了什么还是group by针对丢失了呢?
对于to_char函数带来的影响我们无法直接辨别,但是group by到底有没有做,我们可以通过语句执行时的执行计划来判断。
幸好,我们有客户给过来的10053trace文件,其中显示的执行计划是这样的:
新的问题来了:在原语句中存在两个group by,内层的没有带to_char函数,外层带有to_char函数,那么这里是在按照我们之前预期的简化之后将to_char函数去掉了呢,还是优化器偷懒直接将内层的group by作为整个语句的分组函数了;
通常来说,SQL在被优化器进行查询转换的时候是经过了很多步骤才转换成其最终的步骤的,这里我们看到final的查询并不是我们所期待的,那我们就必须从trace文件中final query位置往前检索,对比前后的变化,看看是哪一步把关键的group by弄丢了或是弄错了。
很快,我们找到了这样一个步骤:
还有一点需要注意的,我们注意到虽然_optimizer_aggr_groupby_elim参数引起的bug不少,但是毕竟这里改参数只是oracle提供的一个workaround,我们还需要通过精确的匹配相应的bug,针对具体bug打上具体的补丁:
我们使用关键字“wrong results“”和”_optimizer_aggr_groupby_elim”进行搜索,可以找到文档如下,其给出的描述与我们遭遇的案例一致:
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞0
添加新评论0 条评论