使用函数调用从选择中插入到表的 Oracle 中的性能

Posted

技术标签:

【中文标题】使用函数调用从选择中插入到表的 Oracle 中的性能【英文标题】:Performance in Oracle insert to table from select with function calls 【发布时间】:2018-08-20 10:10:12 【问题描述】:

我正在编写一个查询来计算一些值并定期将它们保存到一个表中。我需要的值是从函数调用返回的。

这些值需要保存到表中,我有一个 dbms 计划作业将这些值插入到表中。该作业执行以下操作;

BEGIN
execute immediate 'truncate table tbl1';
INSERT /*+ append*/ INTO tbl1(v1, v2, v3, v4)
SELECT
    function1(input), 
    function2(input),
    function3(input),
    SYSDATE
FROM tbl;
END;

计划的作业运行超过 8 小时,记录超过 50 万条!我了解函数中的逻辑非常耗时,并且在从函数中进行选择时会发生上下文切换。我有没有其他方法可以实现这一目标,并且性能更好?

我使用的是 Oracle 12c。有什么建议可以让我更快地完成这项工作吗?

【问题讨论】:

显然问题出在函数上,所以请给我们看他们的代码。也许RESULT_CACHE 可能会有所帮助。 @WernfriedDomscheit 感谢您的意见。不幸的是,我无法更改函数的内容。我只是使用这些函数来构建查询,并且必须从我的最终找出一些东西。 :( 我会检查 RESULT_CACHE 谢谢!:) 请注意,启用RESULT_CACHE 需要更改功能代码。 【参考方案1】:

函数复杂吗?

如果不是,不能在每次插入 tbl 后调用函数并将结果存储在新列中吗?因此,当调用作业时,函数 1、2 和 3 将替换为存储值的 colmun。

【讨论】:

以上是关于使用函数调用从选择中插入到表的 Oracle 中的性能的主要内容,如果未能解决你的问题,请参考以下文章

在带有 oracle 光标的过程中使用用户定义的函数

在 Oracle 中将结果集插入到表中

记录集到表?

Foxpro / SQL复制值从游标到表的id匹配

我想将表单中的数据插入到表中,然后从另一个表中选择另一个数据并使用 PHP 插入到第三个表中

Oracle 中临时表的替代方案