我有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