使用SQLLDR / SQL Loader运行并行运行的解决方案

时间:2012-07-23 04:55:38

标签: parallel-processing sql-loader temporary staging

我有一个情况!

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

组件:

a)表:TempTableA,FinalTableA,TempTableB,FinalTableB;    这些表中的每一个都由模块Key唯一表示。    模块密钥默认为'-99' b)外部文件(FileA,FileB)没有模块密钥,但只有数据。 c)脚本知道该模块的模块密钥。 d).ctr文件

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

截断表TempTableA sqlldr $ USER / $ PASSWRD @ $ PRD_SID control = ctr / fileA.ctr log = log / fileA.log bad = log / fileA.bad skip = 1 rows = 10000 silent = FEEDBACK

更新表TempTableA set moduleKey = $ moduleKey其中moduleKey =' - 99' 从TempTableA插入FinalTableA作为select *;

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

有更好的解决方案吗?

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

1 个答案:

答案 0 :(得分:0)

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

取消UPDATE句子。将其替换为CTL文件中的常量。

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

来自智利的问候。

Pável