我有一个场景,我需要从Table1到Table2复制5亿行。几点,
所以,这是我做这项活动的方法,我要求提出建议,以改善或预防一些突如其来的不良情况。
有什么建议吗?非常感谢你的时间。
答案 0 :(得分:2)
使用单个SELECT
语句而不是PL / SQL。
不需要提交块或提供镜像分区的并行策略。如果APPEND
提示有效且使用直接路径写入,则不会有任何重要的REDO或UNDO使用,因此您不需要运行块来减少资源消耗。 Oracle可以轻松地将一个段划分为粒子 - 它只是将一堆块从一个地方复制到另一个地方,如果它按处理它们分区并不重要。 (一些可能的例外情况是,如果您使用的是不支持并行SQL的奇怪列,或者您正在连接表并使用分区智能联接。)
alter session enable parallel dml;
alter table table2 nologging;
--Picking a good DOP can be tricky. 32 might not be the best number for you.
insert /*+ append parallel(32) */ into table2
select * from table1;
commit;
alter table table2 logging;
在运行此操作之前,请检查执行计划。有很多东西可以阻止直接路径写入,并且您希望在启动DML之前找到它们。
在执行计划中,确保您看到“LOAD AS SELECT”以确保直接路径写入,“PX”确保并行性,并在“LOAD AS SELECT”之前执行“PX”操作以确保两个写入并且读取是并行完成的。
alter session enable parallel dml;
alter table table2 nologging;
explain plan for
insert /*+ append parallel(32) */ into table2
select * from table1;
select * from table(dbms_xplan.display);
我经常发现单独处理索引是不值得的。但这可能取决于索引的数量。