oracle结果集过大,多重子查询/大结果集查询问题
多重子查詢/大結果集查詢問題:
問題接此帖http://www.itpub.net/273652.html
上次問題通過調整SGA/SQL語句得到優化[最終情況:oracle關閉重起后,程序第一次執行存儲過程(需要大量讀取物理文件):1500秒,等第2次跑時150秒(數據進入sga區了),完全符合一切oracle教科書的內容!]
現在的問題是上次問題的綜合,
起因: 在我們的應用系統(OLTP,其他的事務都比較小且并發用戶也比較多)中有一個查詢重復的需求,比如企業/市/省/全國各級管理部門,每一級都需要查本級別管轄范圍內是否存在重復的人員記錄,程序人員采用多重子查詢來實現,其中select嵌套5層,子查詢的結果集返回數也很巨大,不會小于20W行;
也曾嘗試使用臨時表,但臨時表(insert *** select )單獨跑select 還比較快,12秒吧,但是insert的過程比較慢,得20多分鐘
btw:臨時表這個對象放在哪了呢?對它的操作(尤其是大結果集時)容易產生什么瓶頸呢?臨時表后邊也是接著一大堆的查詢條件,有可能還有優化的,為什么單獨執行SELECT比較快,而INSERT就慢呢?而且事務實在巨大,還有臨時表嵌套的情況啊!
(后來沒法子,又回到了多重子查詢的老路上來,明知有問題啊!)
測試環境(以下都是測試機上的運行結果)/真實環境(年底上線,且還需要從SQL SERVER中遷移):
服務器: P4 2.8 內存2G/ IBM H85 POWERPC 4顆/內存 12G
軟件:win2k+oracle8.1.7.0/ aix 4.3.3+ oracle8.1.7.4
表現:
oracle關閉重起后,程序第一次執行存儲過程(需要大量讀取物理文件):1500秒,等第2次跑時150秒(數據進入sga區了)
雖然第2次執行存儲過程比較快的,可是每換一個部門,意即:查詢條件改變,就需要重新的1500秒!這個很顯然不能滿足客戶的要求,而且管理部門眾多,測試的是一個部門的一個查詢,實際的情況是N多的府縣道臺,他們各有各的查詢,到時候豈不是歇菜了啊!
附件內容:
1、存儲過程(Ora_PersonProc.sql/Ora_PersddonProc.sql)和最終的SELECT語句(XXXXXX.sql);
2、數據庫物理文件情況(data.jpg):
TEMP/RBS表空間都有擴展,懷疑有大量的磁盤排序/回滾段請求導致擴展(因為事務請求的數據實在太多了)
3、statspack報告(statspack3_4.txt):
是第2次運行同樣的存儲過程時的前后SNAP,這個就比較快的(3分鐘左右),初步分析了一下:問題語句不言自明,就是這個
Buffer Gets? ? Executions??Gets per Exec??% Total??Hash Value
--------------- ------------ -------------- ------- ------------
29,912,794? ?? ?? ?? ?1? ?29,912,794.0? ?100.0? ?4192360910
select et.* from (??Select enta.*,sd.FName as FPersonTypeName f
rom (??Select ed.*,svs.FSpecialityName,svs.FSpecialityTypeName,
svt.FName As FTechName ,svt.FLevel as FTechLevel,??sve.FName as
FEduName,sve.FLevel As FEduLevel from (??select ente.*, ent.FAd
dress,ent.FName??as FEnterpriseName from (??select ed3.* from??(
還有:
Execute to Parse %:??-46.32
是什么意思呢?
各位老大,還給看看有什么別的問題么?
4、分析表時報錯信息(analyze_error.txt):ora-00600
謝謝大家!
總結
以上是生活随笔為你收集整理的oracle结果集过大,多重子查询/大结果集查询问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux的php优化,linux优化转
- 下一篇: oracle导入脚本乱码,imp导入乱码