【问题标题】:Load multiple tables in parallel并行加载多个表
【发布时间】:2017-08-29 23:54:31
【问题描述】:

我有 10 个表,它们连接到 10 个不同的源表。基本上我会截断目标表,然后将每个源的批量插入到单个目标表中。

例如:Src_A --->Tgt_A Src_B ---> Tgt_B

每个“Insert into tgt select * from src”语句一个接一个地循环运行。是否可以使所有语句在一个过程中并行运行,例如当数据被加载到 Tgt_A 时,它也应该将数据加载到 Tgt_B。

感谢您的宝贵意见。

敏捷。

【问题讨论】:

  • 您需要通过调度程序并行运行单独的作业;可能被锁住了,所以你等待它们全部完成。
  • 是的,我们可以做到,但是否可以在一个过程中并行加载表??

标签: sql plsql oracle11g toad


【解决方案1】:

您可以使用 Oracle 的并行执行调优。它基本上并行化一个查询,但不并行化不同的查询。

这就是使用 PARALLEL 提示的方式。 INSERT 和 SELECT 可以独立并行:

alter session enable parallel dml;

INSERT /*+ PARALLEL(4) */ INTO tbl_ins
    SELECT * FROM tbl_sel;

要使 N 个查询并行,您需要 N 个不同的数据库连接,每个连接执行不同的查询。

【讨论】:

    【解决方案2】:

    Oracle 的 DBMS_JOB 可以满足您的要求。基本上,当您提交作业时,Oracle 将并行触发所有作业,因为减少了执行的总时间。 希望下面的 sn-p 有所帮助。

    DECLARE
    lv_job1 PLS_INTEGER;
    lv_job2 PLS_INTEGER;
    lv_job3 PLS_INTEGER;
    lv_job4 PLS_INTEGER;
    BEGIN
      DBMS_JOB.submit ( lv_job1, 'BEGIN
                                  EXECUTE IMMEDIATE ''TRUNCATE TABLE TGT1'';
                                  INSERT INTO SRC1
                                  SELECT * FROM SELEC_TAB;
                                  END;
                                  ');
    
        DBMS_JOB.submit ( lv_job2, 'BEGIN
                                  EXECUTE IMMEDIATE ''TRUNCATE TABLE TGT2'';
                                  INSERT INTO SRC2
                                  SELECT * FROM SELEC_TAB;
                                  END;
                                  ');
    
         DBMS_JOB.submit ( lv_job3, 'BEGIN
                                  EXECUTE IMMEDIATE ''TRUNCATE TABLE TGT3'';
                                  INSERT INTO SRC3
                                  SELECT * FROM SELEC_TAB;
                                  END;
                                  ');
    
        DBMS_JOB.submit ( lv_job4, 'BEGIN
                                  EXECUTE IMMEDIATE ''TRUNCATE TABLE TGT4'';
                                  INSERT INTO SRC4
                                  SELECT * FROM SELEC_TAB;
                                  END;
                                  ');
      COMMIT;
    END;
    /
    

    【讨论】:

    • 我喜欢这个想法,但是当我尝试遇到这个问题时,“必须声明 ora-06550 pls-00201 DBMS_JOB”......这个过程是否只能由 DBA 访问?普通 Oracle 用户可以在不需要 dba 授权的情况下执行此类似功能吗??
    • DBA 必须将 DBMS_JOB 包的执行权限授予您的用户。使用这种方法是个好主意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    相关资源
    最近更新 更多