一个客户反应,几乎相同的两个sql,查询出来的结果却不同:
如下,当使用select *的时候结果是正常的,能查询到所有的7条数据,当指定字段查询的时候结果是错误的,只能查询到一条数据,sql如下:
这种问题,一般都是执行计划不一致导致的,不同的执行计划表的访问方式,过滤等都可能会导致此问题:
查看两个sql的执行计划,下面分别是1,2的执行计划:
我们发现错误的执行计划中使用了inlist iterator,我在MOS进行查找,发现很多执行计划中使用inlist iterator导致的查询结果错误的bug,可能的bug如下:
那么如何避免此bug呢?尝试使用MOS推荐的设置10181或者10157事件,发现都不起效果,最后想到,这个可能是11.2.0.4的新特性导致,那么可以尝试将优化器版本设置为老的版本:
我在sql级别将优化器版本设置为了11.2.0.3后,重新查看执行计划发现正常了,没有再使用INLIST ITERATOR,执行结果也是正确的: