Sql Oracle函数性能明显低于子查询

Sql Oracle函数性能明显低于子查询,sql,oracle,Sql,Oracle,我有一个公式,我需要重复使用,以获得一个特定的日期。下面的示例是为了演示而编写的 select max(order_date) from orders where processing_date < sysdate ; 然而,这是正常的 select * from order where order_date = (select max(order_date) from orders where proce

我有一个公式,我需要重复使用,以获得一个特定的日期。下面的示例是为了演示而编写的

select max(order_date)
from orders
where processing_date < sysdate
; 
然而,这是正常的

select *
from order
where order_date = (select max(order_date)
                    from orders
                    where processing_date < sysdate);

我能做些什么使函数“工作”吗。我不明白为什么演出会受到如此巨大的冲击。

这是一个非常大的话题,有很多细微差别。简而言之,您需要了解PL/SQL上下文切换、SQL中PL/SQL函数的一致性、PRAGMA UDF、RESULT\u缓存或deterministic子句等优化技术


例如,您可以阅读我的系列:

函数通常会阻碍优化器的运行,使其速度大大降低。可能:select*from order where order\u date=select F\u GET\u date from dual;这似乎在LukaszSzozda起作用。你知道为什么吗?@TomBennett:也许,选择F_GET_DATE FROM dual会因为FROM dual而执行一次@卢卡斯:是吗?@shahkalpesh是的,但由于标量子查询,CachingParampa UDF看起来很有希望,但不幸的是,我仍然使用11g。从dual中选择F_GET_DATE似乎可以达到目的though@TomBennett从dual中选择F_GET_DATE-它被称为标量子查询缓存SSC。你可以通过链接了解更多信息above@TomBennett你可以把deterministic子句添加到你的函数定义中,它会起作用的。我已经做了一些关于使用deterministic的研究,不应该在函数输出可能有一天会为相同的函数输入返回不同的结果的地方使用它。由于这是在调用数据库表,我认为这不值得冒险,而是简单地使用select F_GET_DATE from dual。请阅读上面的链接:确定性函数结果仅在一次fetch调用期间缓存。
select *
from order
where order_date = F_GET_DATE;
select *
from order
where order_date = (select max(order_date)
                    from orders
                    where processing_date < sysdate);
select f_get_date
from dual;