2017-04-04 39 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包的執行訪問權授予用戶。使用這種方法是一個好主意。 –