大家好,我需要将6000000行从TMP_DATA复制到DATA,什么是最好的方法?
我当时正在考虑做INSERT INTO DATA SELECT * FROM TMP_DATA
。但是我认为插入会花费很多时间。
您有什么建议?
问候,
答案 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
表将 无法恢复。