sql出现结果集错误以及出现ora-600或者ora-7445错误的解决方法思路

sql出现结果集错误以及出现ora-600或者ora-7445错误的解决方法思路
sql出现结果集错误以及出现ora-600或者ora-7445,一般都是优化器的bug导致的,这时候一般有2种方式解决
1.这个bug有相对应的补丁集,这时候可以通过补丁的方式解决
2.通过改变sql的执行计划来绕过bug,因为出现结果集错误一般都是走了
特定的执行计划导致的,这时候可能是通过修改sql,加hint,或者修改参数
解决思路:
1.首先查看执行计划,观察执行计划中是否有比较怪异的access plan,如果有比较怪异的
执行计划,那么先通过别的手段绕过,然后查看结果集能否搞对,以前遇到过因为btree index
走成bitmap的时候出现结果集错误的情况
2.修改优化器默认,看看走rule的时候是否出现结果集错误
3.修改optimizer_features_enable为不同的版本,如果数据库是10g,那么设置optimizer_features_enable
为9i的,看看是否能解决问题,因为不同的版本优化器选择的执行计划是不一样的
4.通过别的手段,解决了问题,这时候我们可以对比,出问题的执行计划和没问题的执行计划之间的差异,然后
解决差异
5.查询metalink,搜索类似案例
案例:
最近遇到的一个sql结果集错误具体情况是这样的,程序在执行insert 之前会先对select部分做个查询,单独执行
select的时候,结果返回45行,但是执行insert ..select的时候返回90行,如果把insert select单独拿出来在别的
工具中执行的时候,返回的也是45行,说明在程序里执行的时候结果集是错误的
解决思路:
a.因为单独执行的时候结果集是对的,那么应该先保留住这时候正确结果集时的执行计划
b.捕获程序中执行时的sql执行计划,发现这时候的执行计划和单独执行的执行计划是一样的
这种情况一般是很少见的,就是说这个sql的执行有时候对有时候不会
c.改变查询语句中的条件,发现某些情况下语句在程序里跑还是能走对的,于是抓取这时候的
执行计划,对比现在的执行计划和错误结果集时候的执行计划,发现结果集正确的时候,有2个表
之前走的是hash join,而错误的执行计划走的是nest loop
d.一般情况下,这时候已经找到了执行计划的差异,可以通过hint来解决这个问题,但是因为sql批凑的程序比较复杂,
如果加hint,会影响到很多sql
e.搜索metalink,发现Bug 5893779 的描述十分类似前面的现象,参考metalink Doc ID:  406966.1
通过修改参数_table_lookup_prefetch_size=0,绕过这个问题
f.经测试,修改参数后结果集正确了

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8984272/viewspace-619911/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/8984272/viewspace-619911/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值