我有10個表,它們連接到10個不同的源表。基本上,我截斷目標表,然後從每個源批量插入到單個目標表中。並行加載多個表
如:Src_A ---> Tgt_A Src_B ---> Tgt_B
每個 「INSERT INTO TGT SELECT * FROM SRC」 語句在循環陸續運行。是否有可能使所有語句在一個單獨的過程中並行運行,例如數據在Tgt_A中加載時它也應該將數據加載到Tgt_B中。
欣賞您的寶貴意見。
Dex。
我有10個表,它們連接到10個不同的源表。基本上,我截斷目標表,然後從每個源批量插入到單個目標表中。並行加載多個表
如:Src_A ---> Tgt_A Src_B ---> Tgt_B
每個 「INSERT INTO TGT SELECT * FROM SRC」 語句在循環陸續運行。是否有可能使所有語句在一個單獨的過程中並行運行,例如數據在Tgt_A中加載時它也應該將數據加載到Tgt_B中。
欣賞您的寶貴意見。
Dex。
您可以使用Oracle的並行執行調優。它基本上並行化一個查詢,但不同時查詢不同。
這是如何使用PARALLEL提示。 INSERT和SELECT可以獨立地並行:
alter session enable parallel dml;
INSERT /*+ PARALLEL(4) */ INTO tbl_ins
SELECT * FROM tbl_sel;
爲了使N查詢的並行,就需要N個不同的連接到數據庫,每一個執行不同的查詢。
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;
/
我喜歡這個主意,但當我試圖得到這個問題時「ora-06550 pls-00201 DBMS_JOB必須聲明」......這個過程是否只能由DBA訪問?普通的Oracle用戶可以在不需要dba授權的情況下執行此類似功能嗎? – Dex
DBA必須將DBMS_JOB包的執行訪問權授予用戶。使用這種方法是一個好主意。 –
您需要通過調度程序並行運行單獨的作業;也許鏈接,所以你等待他們都完成。 –
是的,我們可以做,但它可能在一個單一的過程中,我並行加載表? – Dex