insert into table a select * from table b ;
量表结构一样,b表大概2千万条,
这一次性插入大概要20分钟左右,同时这个事物也非常大。有没有办法让 这语句每1万条提交一次?

解决方案 »

  1.   

    plsql 那不是要循环 2千万次? 那不废了?根据条件倒是也可以。。只是我想有没有什么设置,不用去写plsql语句了。
      

  2.   

     b 表有 分区吗?
    有分区的话 用分区可以添加并行处理 insert into table a select /*+parallel(b,6)*/
           /*+append*/
           *
      from table partition(part....) b ; --parallel(b,6) 后面的 6为并行处理的数量 通常和CPU 数量相同 
      

  3.   

    create or replace procedure bulk_insert(in_bulk_count integer)
    is
    cursor cur is select * from b;
    type tbl_b is table of b%rowtype index by pls_integer;
    v_tbl_b tbl_b;
    begin
     open cur;
     loop
     <<bulk_insert>>
      exit when cur%notfound;
      fetch cur bulk collect into v_tbl_b limit in_bulk_count;
      forall i in indices of v_tbl_b save exceptions
       insert /*+append*/ into a values v_tbl_b(i);
       commit;
      exception
       when others then 
         null;
     end loop bulk_insert;
    close cur;
    end;
      

  4.   

    没有分区
    你下面写的语句是根据分区来的吗?
    我的处理方式是 用查询条件将表分成了129个表,然后挨个insert into table as select * from b_i;
    方法虽然笨了点,好歹可行。。:)
      

  5.   

    那把并行 和 append 加上 看看  
      

  6.   


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

  7.   

    parallel,append,nologging都加上
      

  8.   

    hints append,直接使用hwm以上的数据块,以提高处理效率。
    parallel并行,
    nologging不记日志
      

  9.   

    parallel,append,nologging都加上.再加上分区试一下。