真的,這是兩個相關問題的Oracle SQL函數
問:爲什麼會運行查詢與函數更快的SELECT子句比在where子句
問題:將where子句從內聯視圖移動到外部查詢時,爲什麼內聯視圖需要更長時間?
我不打算轉儲整個查詢,因爲它有與我的工作相關的列和表,但基本上這是它。如果你需要一個工作的例子,我會寫一個類似於我正在做的SQLFiddle。
運行時間:117S, 返回:93條記錄
SELECT COL1, COL2, COL3
FROM my_table
WHERE [CONDITIONS...]
and my_package.my_function(:bind_var, COL1) = 'Y';
如果我跑由它自己會是什麼綁定var和這將是COL1的一個值,將功能拿.06s。所以,
SELECT my_package.my_function(VAL1, VAL2) FROM DUAL;
所以我改寫了這樣的查詢:
SELECT *
FROM (
SELECT COL1, COL2, COL3
FROM my_table
WHERE [CONDITIONS...]
) temp_tbl
WHERE my_package.my_function(:bind_var, COL1) = 'Y';
運行時間:116S, 返回:93條記錄
無功能的查詢接受〜3秒運行,但是對於93個記錄需要0.06s的函數運行需要〜116s是沒有意義的。
我試着看看如果將函數移到SELECT子句會發生什麼。
SELECT *
FROM (
SELECT COL1, COL2, COL3, my_package.my_function(:bind_var, COL1) as fn_indc
FROM my_table
WHERE [CONDITIONS...]
) temp_tbl
WHERE fn_indc = 'Y';
當我運行內聯視圖查詢它需要〜3秒鐘運行。當我添加WHERE fn_indc = 'Y';
時,運行需要大約116秒。爲什麼要將函數從WHERE移到SELECT事件? CHAR的比較並不需要很長時間才能完成。另外,如果我創建了一個內聯視圖,它從函數中檢索了值並在外部查詢中執行了我的where條件,那麼會導致它運行更長時間?
您是否看過這些案例的解釋計劃? –
函數實際執行多少次?優化器可以按照預期效率最高的順序自由評估謂詞。我的猜測是,當查詢速度較慢時,查詢計劃涉及的調用次數超過93次。查詢快時,查詢計劃涉及在調用函數之前將結果集裁剪爲93行。你需要提供查詢計劃來驗證猜測。從理論上講,任何這些查詢都可能會在任何時間點產生快速計劃或慢速計劃。 –
令人困惑的是解釋計劃告訴我,對於在WHERE子句中具有函數的查詢,成本較低。 'WHERE my_package.my_function(:bind_var,COL1)='Y';'的成本是1.不會讓外部查詢中的函數強制優化器先運行內聯視圖? – enigmasck