2017-04-04 3 views
1

私は10個のテーブルを持っており、10個の異なるソーステーブルに接続しています。基本的には、ターゲット表を切り捨てて、各ソースから個々のターゲット表に一括挿入しています。複数のテーブルを並列にロードする

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

各 "SRC SELECT * FROM TGTに挿入" ステートメントは、ループ内で次々と実行されています。すべてのステートメントをTgt_Aでデータがロードされるような単一のプロシージャで並列に実行することは可能ですか?データをTgt_Bにロードする必要があります。

あなたの貴重な入力を気に入ってください。

Dex。

+0

スケジューラを使って別々のジョブを並列に実行する必要があります。おそらくあなたは彼らがすべて完了するのを待つので連鎖するかもしれません。 –

+0

私たちはできることはありますが、1つの手順でテーブルを並行して読み込むことは可能ですか? – Dex

答えて

1

Oracleのパラレル実行チューニングを使用できます。基本的にはクエリを並列化しますが、異なるクエリ間では並列化しません。

これは、パラレルヒントの使用方法です。 INSERTとSELECTは独立して平行になることができます。

alter session enable parallel dml; 

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

Nは、並列クエリにするには、データベース、別のクエリを実行し、それぞれにN個の異なる接続が必要になります。

0

Oracleには、必要なDBMS_JOBがあります。基本的にジョブをサブミットすると、Oracleは実行時間を短縮してからすべてのジョブをパラレルにトリガーします。 スニペットの下に希望があります。

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パッケージの実行アクセス権をユーザーに付与する必要があります。このようなアプローチを使用することをお勧めします。 –

関連する問題