sql出現結果集錯誤以及出現ora-600或者ora-7445錯誤的解決方法思路

棉花糖ONE發表於2009-11-18
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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章