我的查询是这样的:甲骨文分页查询和用户定义的函数 - 执行速度慢
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