求教:
我现在有几十亿的数据条目需要插入数据库,目前没有建索引,使用存储过程。
我在数据库建如下存储过程:
create or replace procedure procedure_insert_001
(
   p_sname in varchar2,
   p_snum  in number,
   p_sloc  in varchar2
) as
begin
  insert into t_costumer(sname,snum,sloc) values(p_sname,p_snum,p_sloc);
commit;
end procedure_insert_001;然后在vc中,用一个list存储了上万条记录(多次循环),然后call procedure_insert_001(参数1,参数2,参数3);然后执行,excute
大概流程就是这样,但是效率特别低,插入了两三天了,才插入1亿条。
我想问问这是什么原因呢?我该怎么设计呢?谢谢大家。

解决方案 »

  1.   

      没做过。不过看你这种方法也是不可取的!
    首先找到你程序的瓶颈在哪 (是插入的时候慢、还是读取数据源的时候慢)?如果像你说的 list 里面存到上万条记录,你岂不是要调用 上万次存储过程?
    至少这里可以这么做:
    利用PreparedStatemnet 的addBatch 然后设定次数 execute 、commit.
      

  2.   

    我现在有几十亿的数据条目需要插入数据库------什么格式的数据?一条一条的插入肯定不行,至少有批量的方法可以采取导入,SQLLOAD,等等实现
      

  3.   

    使用sql*loader可以
    使用外部表也是一种不错的选择
      

  4.   

    你的几十亿条记录是存在os文件中的吧,然后用vc的list(你指的是list控件?还是STL的list?)
    用VC去读OS的文件即使你的内存很大,但是依然会比较慢,因为这是多次IO操作,然后你再插入数据库,我觉得也会很慢。而且一条一条的插入数据确实不如批量插入数据快啊。如果真的是几十亿条记录在os文件中,推荐还是sql*loader吧。
    你可以把大文件转储成一个个的小文件,然后并行插入,估计会好很多。
    不过我没试过在vc里面调用sqlloader,但是用system('')应该也行吧
      

  5.   

    楼上正解
    但是如果你喜欢用手写Insert,建议使用hints方式并行插入把
      

  6.   

    没见过一条条commit的呢,至少要批量吧,
      

  7.   

    INSERT /*+APPEND*/ INTO 
    select /* parallel(tablename,4) from tables nologing;
      

  8.   

    http://www.blogjava.net/19851985lili/articles/110340.html
      

  9.   


    搞错了 这个 
    http://www.blogjava.net/19851985lili/articles/110340.html
    12 # 终结