从语句执行大量插入 select 的最佳方法

Best approach for executing massive insert select from statements

我从语句中插入了超过 10 万条 select,我会将这些语句分成更小的批次。我想出了两种方法,但不确定哪一种更有效。请告诉我你的想法。

我可以使用 APPEND 提示,但由于 ORA-12838,我必须在每个插入语句后放置一个 Commit:并行修改对象后不能 read/modify。

我可以删除提示并在每个批加载结束时只提交一次常规路径加载。

常规路径加载肯定会产生很多日志。但是在每个插入语句之后提交在性能方面是更好还是更差?

过去我不得不将数据从 sql 服务器数据库导出到 oracle 数据库。我最终做的是使用 bcp 将数据从 sql 服务器导出到文本文件,然后使用 Oracle SQL*Loader 将其导入 Oracle。因为 table 之间的关系是一对一的,所以我写了一个小程序来为每个 table 生成 ctl 文件,它还生成了整个脚本。整个过程非常快。

我不确定这是否适合你 - 从你的 post 中还不完全清楚上下文,你是否想编写脚本,或者它是你正在开发的程序,还是 pl/sql...

更新:我对您的建议是使用文本文件和 sql 加载程序导入数据,如果可行的话。如果不知道您实际尝试做的所有细节,就很难给出最佳答案。另一方面,您可能想要回答您非常具体的问题。您在一条评论中提到您生成了脚本。如果你想走这条路,你可以每 500 或 1000 次插入生成一次提交语句。但是,再次退一步,虽然说有 100k 插入语句的脚本没有错,但出于性能原因,我不会这样做,我宁愿使用 sql 加载程序和文本文件来抽取数据.但那只是我。

运行 一次提交的所有查询都将使用大量日志。而且,如果出现任何问题,回滚可能会非常昂贵。所以我会放弃那个选项。

而且我会在每条语句之后从一个提交开始。为什么?因为简单

在 运行 之后,如果过程太慢,添加在一些语句后提交的能力,每 1,000 个语句似乎是一个很好的起点。然后您可以调整该数字以查看您在何处获得最佳性能。