oracle - 在插入新行之前解析外键

标签 oracle plsql

我有一个用作缓冲区的原始表,定期插入新数据(平均每 5 分钟批量插入约 20.000 行)。然后是一个存储的 PL/SQL 程序,它读取这个原始表并将信息插入到数据库的不同表中。
不幸的是,我无法从存储在原始表 中的行直接批量插入目标表,因为部分列(20 列中的 10 列)是目标表中的外键。这意味着在执行插入之前,我必须解析所有外键 ID,然后使用它们在目标表中插入新行。
而且外键表中的元素不可能存在,所以需要插入到外键表中,然后用它的id作为外键id。

我将要使用的解决方案是使用一个存储过程:
1) 对于与目标表中的外键对应的原始表的每一列,我选择该列的不同值,并为每一列选择外部表中的 id,如果它不存在我插入它 reutrning 相对 id;
2) 我将 原始表 的相同行写到一个空的临时表(每次插入之前都会被截断),但使用已解析的外键;
3) 我通过从临时表中选择值在目标表中进行批量插入。

为什么要使用临时表?因为我想避免在超过 5000 万行的目标表中逐行插入。

(我已经继承了 oracle sql 模式,以及解决方案结构的一部分;我什至无法更改它,因为目前有大量的监控工具无法更改)。

如何在目标表中插入新行之前通过解析外键来优化代码?有没有其他更好的扩缩方案可以推荐?

我试图总结我复杂的工作流程,省略了一些细节并概括了一些上下文。

最佳答案

有多少百分比的外键无法解析?

您可以为每个外键主表执行以下操作

INSERT INTO parent_table (id, name)
SELECT id.nextval, r2.name
FROM (SELECT DISTINCT r.name FROM raw)
WHERE r2.name NOT IN (SELECT name FROM parent_table)

然后你就会知道它们都存在并且可以直接插入。

或者,如果它们大部分都在那里,您可以查看 BULK.. EXCEPTIONS INTO并让 SQL 引擎告诉您哪些失败并单独处理它们。

关于oracle - 在插入新行之前解析外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6604093/

相关文章:

oracle - Oracle中如何获取同义词的列列表

sql - 无法在 oracle 中使用正则表达式 substr 获取模式的第二次出现

database - PL/SQL - NOCOPY 参数以提高性能

Oracle - 如何使用动态绑定(bind)参数定义动态 SQL?

sql - 如何停止在 Oracle 树层次结构中的特定分支/级别?

sql - 给定一列的总和,对行对/三元组进行排序

.net - ODP.NET集成安全性无效的连接字符串参数

java - 如何使用传递的参数等列对oracle select进行排序

oracle - 遇到异常ORA-01555

Oracle 在数据库驱动器空间达到临界水平时触发