使用ORACLE11G,最初寫了一個多表查詢的較復雜視圖,使用程序中發現查詢速度不夠理想,查看執行計劃,發現多次進行全表掃描,遂起了優化的念頭。視圖較長,就不貼出來了,簡單描述下,結果為T1,T2,T3,T4,T5,T6六個表聯合查詢,其中T4,T5,T6又是視圖內子查詢生成的表。
想了個笨辦法,使用http://blog.csdn.net/a9529lty/article/details/5672552中描述的方法,自定了兩對get和set函式,將查詢的起始時間和結束時間作為引數,希望在視圖中縮小子查詢SQL的范圍,降低消耗,但是在除錯程序中發現,執行
select XXX, YYY, ZZZ FROM view(復雜查詢) where packge.set_param_dateFrom('2017-05-07')='2017-05-07' and packge.set_param_dateTo('2017-05-09')='2017-05-09'時,發現查詢結果不對,使用PL/SQL進行test發現,執行sql陳述句時,包內的set函式根本沒有執行,直接執行的是get函式,回傳的是空,當然sql查不出結果。反復檢查,也沒查出來簡單的包和函式有什么例外,于是又寫了一個單表查詢的視圖做測驗,select AAA, BBB, CCC FROM view(單表查詢) where packge.set_param_dateFrom('2017-05-07')='2017-05-07' and packge.set_param_dateTo('2017-05-09')='2017-05-09' ,這次可正常進行引數賦值取值,進行test也發現,程序為先實體化包、進行set函式呼叫,進行get函式呼叫,視圖sql執行,回傳需要的行數,證明包和函式均無例外。郁悶之下,再回傳頭看看自己最初修改的包含引數的復雜存盤程序,懷疑是不是子查詢sql陳述句有問題,于是逐步注釋T1到T6表,再進行測驗,終于發現,只要視圖中包含T5.T6兩個表,就會再次出現最初的問題,否則一切正常。這點真是讓人百思不得其解。。。T1、T2、T3三個表為單表,應該不會有什么問題,后三個表的共同特點為都使用了group by,但T4是使用PIVOT的行列轉換,增加T4也不出問題,就是T5、T6使用一般函式(一個MAX()結合group by,一個DECODE結合group by)的分組就不行,難道group by也會影響呼叫包內的函式?說了一大堆不知表達清楚沒,因問題比較特殊,網上到處查資料也不明白,請各位大大幫忙解答,小弟拜謝!!
uj5u.com熱心網友回復:
求各位大神解答啊。。。真的讓人百思不得其解。。、uj5u.com熱心網友回復:
把 set 寫在 begin 中也可以;轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/96396.html
標籤:開發
上一篇:資料挖掘
