【问题标题】:Solution to run parallel runs using SQLLDR/SQL Loader使用 SQLLDR/SQL Loader 运行并行运行的解决方案
【发布时间】:2012-07-21 08:13:30
【问题描述】:

我有情况!

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

更新表 TempTableA 设置 moduleKey = $moduleKey where moduleKey = '-99' 插入 FinalTableA 作为 select * from TempTableA;

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

有没有更好的解决方案?

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

【问题讨论】:

    标签: parallel-processing sql-loader temporary staging


    【解决方案1】:

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

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

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

    来自智利的问候。

    帕维尔

    【讨论】:

      猜你喜欢
      • 2017-04-06
      • 1970-01-01
      • 2012-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多