一个SQL语句引发的ORA-00600错误排查
在table_xx的地方加入子查询,可能会让我们在联想到一些语句中使用子查询的DML方式,但是在merge语句中,这个地方会有问题,所幸的是这个问题目前的测试没有发现对线上环境产生严重的影响,需要引以为戒,不过问题还不能这么轻易下结论,我们继续往下看. 5认知的反转如果只是像上面那么想,充其量只是一个攻略,而且你对Merge印象会更加糟糕. 难道是Merge有什么特别之处吗,我们来看看Oracle的官方对于Merge语句的解释.可以看到merge into后面可以是table或者是view. 我在上面的测试使用的是子查询,那么试试view可不可行呢. 我们创建一个view. create view test_view as select * from test_bug where object_type=’TABLE’; 我滴个神,这个问题确实就是这么任性,那么我们是不是可以得出一个结论,在merge into的后面只能使用table或者view,不能使用子查询呢,还是不要过早下结论. 6持续反转(二)对于这个问题,我们也进行了小范围的讨论,兔子大师在看到我的这个问题之后,在11.2.0.4的版本中进行了测试,之前我碰到的那个问题在这个版本中就不复存在了,兔子威武. 测试复现的过程很简单: create table test_bug as select * from dba_objects where rownum<1; 解析生成执行计划,可以看到这个时候就没有问题了. 可见这个问题在11.2.0.4之前的版本会抛出ORA-00600,算是一个bug中的bug吧. 7简单总结通过上面波澜起伏的测试和复现、验证,我们可以得出这样的一个结论:这个问题和表中的数据量无关,和是否使用子查询也没有关系,是在特定版本中出现的一个特定的问题,当然明白了原委,我们完全可以规避这个问题. 而且这个场景中Merge的使用有些不太到位,其实也可以考虑使用INSERT语句来实现. 8反思(编辑:成都站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |