2017-04-04 43 views
1

我有10个表,它们连接到10个不同的源表。基本上,我截断目标表,然后从每个源批​​量插入到单个目标表中。并行加载多个表

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

每个 “INSERT INTO TGT SELECT * FROM SRC” 语句在循环陆续运行。是否有可能使所有语句在一个单独的过程中并行运行,例如数据在Tgt_A中加载时它也应该将数据加载到Tgt_B中。

欣赏您的宝贵意见。

Dex。

+0

您需要通过调度程序并行运行单独的作业;也许链接,所以你等待他们都完成。 –

+0

是的,我们可以做,但它可能在一个单一的过程中,我并行加载表? – Dex

回答

1

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

这是如何使用PARALLEL提示。 INSERT和SELECT可以独立地并行:

alter session enable parallel dml; 

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

为了使N查询的并行,就需要N个不同的连接到数据库,每一个执行不同的查询。

0

Oracle拥有DBMS_JOB,它可以满足您的要求。基本上,当你提交工作时,甲骨文将会平稳地触发所有的工作,因为减少了总体执行时间。 希望下面的代码有助于。

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; 
/
+0

我喜欢这个主意,但当我试图得到这个问题时“ora-06550 pls-00201 DBMS_JOB必须声明”......这个过程是否只能由DBA访问?普通的Oracle用户可以在不需要dba授权的情况下执行此类似功能吗? – Dex

+0

DBA必须将DBMS_JOB包的执行访问权授予用户。使用这种方法是一个好主意。 –