Oracle数据库
现有两张表A、B,两张表结构一模一样,现在想把B表的数据全量插入A表中,B表数据大概40万我的语句是:insert into A select * from B;执行速度太慢了,有没有高手知道,怎么写能够提高速度,谢谢了!

解决方案 »

  1.   

    1. 采用高速的存储设备,提高读写能力,如:EMC 和NetApp,
    2. 假如tab1表中的没有数据的话 
    DROP   TABLE   TAB1;
    CREATE   TABLE   TAB1   AS   SELECT   *   FROM   TAB2;
    然后在创建索引 
    3. 用Hint 提示减少操作时间
        INSERT   /*+Append*/   INTO     tab1 
                    SELECT   *   FROM   tab2;
    4. 采用不写日志及使用Hint提示减少数据操作的时间。
    建议方案是先修改表为不写日志: 
    sql> alter   table   table_name   NOLOGGING; 
    插入数据:
    INSERT   /*+Append*/   INTO     tab1 
          SELECT   *   FROM   tab2;
    插入完数据后,再修改表写日志: 
    sql> alter   table   table_name   LOGGING; 
    这里的区别就在于如果插入数据的同时又写日志,尤其是大数据量的insert操作,需要耗费较长的时间。
    5. 用EXP/IMP 处理大量数据
    (1)给当前的两个表分别改名 
    alter   table   tab1   rename   to   tab11; 
    alter   table   tab2   rename   to   tab1; 
    (2)导出改名前的tab2 
    exp   user/pwd@...   file=...   log=...   tables=(tab1) 
    (3)把名字改回来 
    alter   table   tab1   rename   to   tab2; 
    alter   table   tab11   rename   to   tab1; 
    (4)导入数据 
    imp   user/pwd@...   file=...   log=...   fromuser=user   touser=user   tables=(tab1) 
    Oracle 插入大量数据
    http://blog.csdn.net/tianlesoftware/archive/2009/10/30/4745144.aspx
    ------------------------------------------------------------------------------ 
    Blog: http://blog.csdn.net/tianlesoftware 
    网上资源: http://tianlesoftware.download.csdn.net 
    相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx 
    Q Q 群:62697716 
      

  2.   

    merge into试试看:以下假设ID是PK,则此sql效率蛮高的,特别数据量大的时候
    这是相同的进行修改。
    merge into  a
    using (select id,name from b ) c
    on(a.id=c.id )
    when matched then update set a.name=c.name
    when not matched then insert (a.id,a.name) values (c.id,c.name);
    这是没有的进行插入。如果A是新表的话,不需要修改
    merge into  a
    using (select id,name from b ) c
    on(a.id=c.id )
    when not matched then insert (a.id,a.name) values (c.id,c.name);
      

  3.   

    Oracle forall 语句
    FORALL语句的一个关键性改进,它可大大简化代码,并且对于那些要在PL/SQL程序中更新很多行数据的程序来说,它可显著提高其性能。
      

  4.   

    alter table a nologging;
    insert /*+ APPEND */ into A select * from B; 
      

  5.   

    insert /*+append nologging+*/into a  select * from b