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

时间:2015-05-29 01:27:06

标签: sql oracle oracle11g database-performance

我有超过100k的插入select语句,我将分成更小的批次。我提出了两种方法,但不确定哪种方法更有效。请告诉我你的想法。

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

我可以删除提示并在每次批量加载结束时只使用一次提交来进行常规路径加载。

传统路径加载肯定会产生大量日志。但是,在每个插入语句之后,在性能方面会更好还是更差?

2 个答案:

答案 0 :(得分:1)

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

我不确定这是否对您有用 - 从您的帖子中了解上下文,是否要编写脚本,或者您正在开发的程序,还是pl / sql ...... < / p>

更新:我的建议是使用文本文件和sql加载器导入数据,即如果可行的话。如果不了解您实际尝试的所有细节,很难给出最佳答案。另一方面,您可能想要回答您的具体问题。您在其中一条评论中提到了您生成的脚本。如果您想要使用此路径,则可以每500或1000次插入生成一次commit语句。但同样,退一步,虽然每个说有一个带有100k插入语句的脚本没有错,出于性能原因,我不会这样做,我宁愿使用sql loader和文本文件来泵送数据。但那只是我。

答案 1 :(得分:0)

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

我在每个陈述后开始一次提交。为什么?因为它很简单。

运行后,如果进程太慢,在一些语句后添加提交能力,每1,000个语句似乎是一个好的起点。然后,您可以调整该数字,以了解您获得最佳效果的位置。