【问题标题】:Inline functions in pl/sql?pl/sql 中的内联函数?
【发布时间】:2011-02-11 11:57:02
【问题描述】:

我有 5 行代码作为被调用 100000 次的函数,有没有办法使函数内联,这样我就不会在 PL/SQL 中遇到调用开销。 Oracle 9i 是我正在使用的版本。

更新: In lining of code 没有太大改进,但我获得了 2 秒。现在我正在寻找 pl/sql 中浮点数据类型的有效版本。 BINARY FLOAT 不起作用,NUMBER(10,5) 是已经被使用的。

【问题讨论】:

  • 不幸的是,PRAGMA INLINE 仅在 Oracle 11g 中引入。 download.oracle.com/docs/cd/B28359_01/appdev.111/b28370/…
  • 您是否确定在调用此函数时存在显着的有害开销?
  • @Jeffrey Kemp 这就是我指定 oracle 9i 的原因,你知道如果我手动内联它是否有什么好处吗,知道函数调用开销会有多少 b/w 100000 - 1000000?.
  • @Charles 我怀疑因为该函数被调用了很多次并且性能损失在该函数中,无论如何我会尽快挖掘并让你知道,因为周末已经在这里开始了:)。
  • @yesraaj,这就是为什么我把它作为评论而不是“答案”:)

标签: function plsql inline oracle9i


【解决方案1】:

您已确定函数调用开销对性能问题的影响不大,因此内联在这里无论如何都没有帮助。

我假设您没有在 PL/SQL 中运行任何 SQL 或调用任何 SQL 函数?如果是这样,我接下来会去那里看看。

您的下一个选项是本地编译 - 详情请参阅 Compiling PL/SQL Code for Native Execution。你可能会得到一些进步,因为你只是在做数学。

否则,您可能需要超越 PL/SQL。您可以从 PL/SQL 调用以许多其他语言编写的代码,包括 C、C++ 和 Java。更多信息请参考Calling External Procedures

【讨论】:

  • 实际上我调用了最多需要 7 秒的 sin 和 cos 函数,我怎样才能最小化呢?
  • 你调用了多少次函数?它打了多少个 sin/cos 调用?参数是否非常独特或是否有许多重复参数(即,您可以缓存常见值的结果吗?)
  • @Jeffrey Kemp 我无法缓存 sin/cos,因为它们一直在变化,但是我可以消除循环内的 select 语句,我正在寻找 map(key, value) 类型的数据pl/sql 中的结构。
  • @yesraaj:你看我的回答了吗? “我假设您没有在 PL/SQL 中运行任何 SQL 或调用任何 SQL 函数?”如果您正在运行任何 SQL,那么无论您多久调用一次 sin/cos,我都会 99.9% 确定 SQL 查询是问题所在。叹息:(
  • @Jeffrey Kemp 是的,我阅读了您的回答,正如您所说的主要性能滞后将是由于 SQL 造成的,我正在尝试消除选择查询,但如果没有 sin/cos 函数,我可以节省 6 秒这是整个过程运行所需时间的 25%。
猜你喜欢
  • 2020-03-07
  • 1970-01-01
  • 2011-09-14
  • 2011-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-24
  • 1970-01-01
相关资源
最近更新 更多