我是 Oracle 技术的新手(主要精通 SQL Server)并且我在 UDF 的性能方面遇到了麻烦。
UDF 的目的是为“事件”获取一些输入,并查找“事件 b 发生的预期时间”。该函数返回单个DATE
值。
首先发生的是SELECT ... INTO [variable] FROM DUAL;
一个变量。最后在引用表(仅约 30k 行)中进行查找,并将其存储在返回变量中。
处理 80 万行需要 8 个小时。我可以在不到 40 秒的时间内选择所有列,而无需使用该功能。
我的主要问题是:使用 DUAL 会让我付出代价吗?
我们在 Oracle 11g RAC 上。
不。Oracle 知道 DUAL 是“内存中”表。你的问题在别的地方。
顺便说一句:你也可以使用
call fname(...);
语句。正如 Ivan 所说,您的问题不在于 dual。但是,在 PL/SQL 和 SQL 之间切换所需的上下文切换正在减慢速度。通常,像这样的 SELECT 语句可以转换为简单的 PL/SQL 赋值。如果那不可能,也许可以将逻辑移到以后的查找中。
您可以考虑的其他事情是在 UDF 之外与您的参考表进行连接。
不过,在做任何事情之前,您应该考虑使用DBMS_PROFILER分析函数。这将向您展示您的调优需要关注函数的哪一部分。