在ORACLE中将6000000条记录从一个表插入到另一个表的最佳方法是什么?

时间:2019-02-04 16:08:06

标签: sql oracle sql-insert

大家好,我需要将6000000行从TMP_DATA复制到DATA,什么是最好的方法?

我当时正在考虑做INSERT INTO DATA SELECT * FROM TMP_DATA。但是我认为插入会花费很多时间。

您有什么建议?

问候,

2 个答案:

答案 0 :(得分:1)

有两种方法可以做到:

如果您想提高速度,请使用并行和无日志记录(在新表上):

-注意:此方法速度很快,但会占用大量cpu资源,所以让

-DBA知道。另外,在表的末尾建立索引。

create table DATA SELECT parallel 4 nologging as
select * from TMP_DATA;

如果使用现有表,则可能会降低插入性能的一件事就是使用索引。您可以暂时禁用索引,以加快插入速度。

答案 1 :(得分:1)

要进一步了解Anders的答案和mathguy的评论,请执行以下操作:

alter table data nologging;
alter session enable parallel dml;
-- disable any triggers on `data` and temporarily drop any indexes

insert /*+ append */ * into data 
select /*+ parallel (4) */ * from tmp_data
--sample (10)  -- if tmp_data has 60 million rows: 10 means 10%
-- where rownum < 6000001 
-- pick one of the two prior clauses if tmp_table has > 6 million rows

插入完成后:

alter table data nologging;  
-- enable triggers and recreate indexes

并让dba进行备份,因为如果加载后出现任何问题,data表将 无法恢复。