我有一个情况!
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 *;
现在我无法并行运行这些模块,因为这些临时表被截断了。
有更好的解决方案吗?
我知道外部表,但这不是关于使用外部表,而是关于如何解决使用共享临时表的问题。这可能与运行并行负载无关。
答案 0 :(得分:0)
您可以并行使用SQL * LOADER并进行直接路径加载。因此,您需要使用DIRECT = TRUE和PARALLEL = TRUE配置命令。
取消UPDATE句子。将其替换为CTL文件中的常量。
我认为您可以在最后一句中使用类似/ * + APPEND * /的提示来INSERT数据。但是,请检查您的要求,以了解是否可以对最终表进行分区。因此,最后一步不是INSERT INTO类型句子,而是EXCHANGE PARTITION一句。这是将数据上传到决赛桌的最快方式。
来自智利的问候。
Pável