【问题标题】:What is the best way to insert 6000000 records from one table to another table in ORACLE?在 ORACLE 中将 6000000 条记录从一个表插入到另一个表的最佳方法是什么?
【发布时间】:2019-02-04 16:08:06
【问题描述】:

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

我正在考虑做INSERT INTO DATA SELECT * FROM TMP_DATA。但我认为插入需要很长时间。

你有什么建议?

亲切的问候,

【问题讨论】:

  • 这可能是最好的方法,而且它不应该花费很长时间(600 万行并不是那么多),除非你在接收表上有很多触发器和索引等等(和/或除非更新是通过慢速网络进行的)。
  • TMP_DATA 上是否有超过 6,000,000 行?有几种方法可以限制行数; select 或 where rownum < 6000001SAMPLE 子句 - 但如果您只关心速度,Andres 在下面的回答很好。

标签: sql oracle sql-insert


【解决方案1】:

要稍微扩展一下 Anders 的答案和 mathguy 的 cmets,请执行以下操作:

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 表将无法恢复。

【讨论】:

    【解决方案2】:

    有几种方法可以做到这一点:

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

    -- 警告:这种方法速度很快,但会占用大量cpu资源,所以让

    -- DBA 知道。另外,索引最后的表。

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

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

    【讨论】:

    • 欢迎来到 StackOverflow。您似乎提供了一个有价值的答案。但是,您想熟悉代码格式(提示:{ } 按钮)。句子中间的双破折号 (--) 的作用是什么?
    猜你喜欢
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    相关资源
    最近更新 更多