1

我有情况!

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

成分 :

a) 表格:TempTableA、FinalTableA、TempTableB、FinalTableB;这些表中的每一个都由一个模块键唯一地表示。模块键默认为“-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

update table TempTableA set moduleKey = $moduleKey where moduleKey = '-99' insert into FinalTableA as select * from TempTableA;

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

有更好的解决方案吗?

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

4

1 回答 1

0

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

禁止 UPDATE 语句。将其替换为 CTL 文件中的常量。

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

来自智利的问候。

帕维尔

于 2013-04-02T15:44:21.770 回答