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.經測試,修改引數後結果集正確了
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- nginx出現403錯誤的解決方法Nginx
- scp出現錯誤的解決辦法
- 編譯EJB出現錯誤的解決編譯
- 隨身碟出現防寫錯誤的解決方法
- 帝國模板登入出現已被登入或者密碼錯誤解決方法密碼
- ontape出現段錯誤(未解決篇)
- GetDlgItem() 出現錯誤Git
- Nginx出現413 Request Entity Too Large錯誤解決方法Nginx
- apache出現 403 permission 和404 not fund錯誤(解決方法)Apache
- Python: 安裝 sklearn 包出現錯誤的解決方法Python
- php抓取https網址出現錯誤的解決方法PHPHTTP
- 【MySql】複製出現Slave_SQL_Running: No 錯誤解決MySql
- exchange出現1025錯誤!(未解決)
- ant構建時出現錯誤解決方案
- Mysql出現連線錯誤解決辦法MySql
- 伺服器出現 HTTP 錯誤程式碼,及解決方法伺服器HTTP
- win10 mstsc出現內部錯誤怎麼修復_win10 mstsc出現內部錯誤解決方法Win10
- Opencv出現detecMultiScale錯誤OpenCV
- centos7部署瓦力可能出現的錯誤以及解決方案CentOS
- 安裝vCenter Server出現1603錯誤的一種解決方法Server
- git push出現unpack failed: error Missing tree錯誤的解決方法GitAIError
- windows10系統升級助手出現錯誤的解決方法Windows
- 連線MySQL出現2013錯誤解決MySql
- XP系統出現記憶體讀寫錯誤解決方法記憶體
- 解決:javadoc生成出現錯誤“未結束的字串字面值”Java字串
- Windows計劃任務出現0x1錯誤結果Windows
- PPT匯入3D模型匯入出現錯誤或者模型紋理消失的解決方法3D模型
- Flutter 最常出現的典型錯誤Flutter
- 配置nagios出現的錯誤iOS
- Laravel 出現 419 錯誤Laravel
- AS打包出現app:transformClassesAndResourcesWithProguardForRelease錯誤APPORM
- 使用 sudo 命令出現錯誤
- FTP出現426錯誤FTP
- Win10系統愛奇藝出現504錯誤程式碼的解決方法Win10
- oracle不走hint原因1:依據hint會出現錯誤結果Oracle
- 解決Centos7 yum 出現could not retrieve mirrorlist 錯誤CentOS
- exp/imp出現錯誤通過expdp/impdp來解決
- 真機除錯出現 application installation failed 錯誤 解決方案除錯APPAI