我的查詢是這樣的:甲骨文分頁查詢和用戶定義的函數 - 執行速度慢
select id, fn_calc(col)
from table_a
order by id
offset 1483800 rows fetch next 100 rows only;
注意,尋呼偏移量是非常高的 - table_a
有150萬左右的行。
上述查詢需要很長時間,但當fn_calc(col)
被替換爲col
時,查詢速度令人滿意 - 至少快5倍。但是當偏移量爲0或100時,兩個查詢幾乎同樣快。爲什麼這個區別?我能想到的
可能的原因:
- 甲骨文執行
fn_calc()
1483900次,雖然它在邏輯上是不neccessary。 (這足以稱之爲只有100次) - 在查詢用戶函數調用的成本是非常高的。
我使用Exadata上的Oracle 12c上。
任何建議可以提供幫助。
UPDATE:
當如下上面的查詢被改變:
select id, fn_calc(col)
from
(
select id, col
from table_a
order by id
offset 1483800 rows fetch next 100 rows only
)
order by id
查詢速度是可比的情況下,當fn_calc()不被調用。
這是爲什麼?
UPDATE:
的執行計劃如下:(對不起,目前只有我是SQLDevelper,所以我不得不抓住的結果。)
第一個查詢:
第二個查詢(其使用子查詢):
要降選民和近選民:你投票前,請註明您對這個問題的關注。我會相應地更新我的問題。這個問題是關於我真實和嚴重的問題。請不要剝奪獲得幫助的機會。
兩個檢查執行計劃。可能是索引使用。其次你需要爲每一行調用函數,這也需要時間。 – lad2025
有多少個不同的col值?函數是確定性的嗎?你也沒有定義任何使得OFFSET有效不重要的ORDER BY – Husqvik
@ lad2025執行計劃是相同的。 – zeodtr