我有一个用作缓冲区的原始表,定期插入新数据(平均每 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/