使用SQLLDR/SQL加载器运行并行运行的解决方案



我遇到了一个情况!

10个模块每个大约需要近2个小时来处理,包括从外部文件加载数据,20个小时的运行是不合理的,而且由于编码方式的原因,它们必须按顺序运行。每个模块都有一组相同的脚本,但处理的数据不同。

组件:

a) 表格:临时表格a、最终表格a、临时表格B、最终表格B;这些表中的每一个都由一个模块Key唯一表示。模块密钥默认为"-99"b) 外部文件(FileA、FileB)没有模块密钥,但只有一个数据。c) 脚本知道该模块的模块密钥。d) .ctr文件

每个模块内部的代码或多或少有以下步骤:

截断表TempTableAsqlldr$USER/$PASSWRD@$PRD_SID control=ctr/fileA.ctr log=log/fileA.log bad=log/fileA.bad=1行=10000静默=反馈

更新表TempTableA设置moduleKey=$moduleKey,其中moduleKey='-99'插入FinalTableA,从TempTableA中选择*;

现在我不能并行运行这些模块,因为这些临时表被截断了。

有更好的解决方案吗?

我知道外部表,但这不是关于使用外部表,而是关于如何解决使用共享临时表的问题。这可能也与运行并行负载无关。

您可以并行使用SQL*LOADER并进行直接路径加载。因此,您需要将命令配置为DIRECT=TRUE和PARALLEL=TRUE。

请将UPDATE语句置于上方。将其替换为CTL文件中的常量。

我认为您可以在最后一句中使用/*+APPEND*/这样的提示来插入数据。但是,请检查您的需求,以了解是否可以对最终表进行分区。因此,最后一步不是INSERT INTO类型的句子,而是EXCHANGE PARTITION类型的句子。这是将数据上传到最终表格的最快方法。

智利的问候。

pável

最新更新