我在vc中用ado访问oracle,
批量插入数据用的是ado的记录集updatebatch
但是效率特别低
插入5万条记录,每条记录约10个字段,需要的缓冲区大约5M内存空间
但是批量插入需要3分钟时间,请问有什么方法来提高效率么?
将时间缩短为30s就行
谢谢

解决方案 »

  1.   

    对VC的ADO不熟悉,不过感觉上应该从应用程序着一面优化,oracle插入这么点数据不会这么慢的。
      

  2.   


    下午我把程序的无关代码注释掉,确实是比较慢的。
    我还试了一下ado的连接集对象,不能批量插入,插入2万条记录就需要将近2分钟。
    不知道是ado的效率确实有问题,还是cpu性能、内存等硬件带来的问题,还是其他问题。
    急死我了!!!
    谢谢!
      

  3.   

    出个馊主意
    用VC把数据按照一定的规则写入一个文件,然后调用oracle后台的plsql开读取这个文件倒入数据。
    更搜得主意是,让sqlloader这类的工具项数据库插入数据。
    不过我还是认为,ado本身也不该有这么慢。
    是否LZ的DBServer和VC的运行环境都是同一台机器,而这台机器又很慢呵!
      

  4.   

    你用了updatebatch还这么慢,有可能就是ADO效率低下造成的
    通常,我都用OCI来导数据,或者sqlldr来弄。
    早就看ADO不顺眼了。
      

  5.   

    估计你没有绑定变量,不要写成
    insert into table values('value1','value2')改成
    insert into table values (?, ?)
      

  6.   

    他既然用了batchupdate,肯定就使用了dynamic binding了
      

  7.   

    谢谢您啊!
    写入文件也可以,我原来就是这种想法,把文件索引存进数据库就行了。
    但是用plsql读文件应该怎么写呢?我还不知道plsql有这种功能
    是不是需要pro c呢?
    我用的是一台机器,但是我的问题是updatebatch访存时间的问题,内存占用率并不高啊!
    谢谢!
      

  8.   


    1. 制定一种格式,写入文件,然后调用或者直接用sqlldr命令入库应该是目前速度最快的一种。
    2. 还是用你所熟悉的ADO,不过,要启动多个线程,比如5个,将那些数据均匀分给这5个线程,
    动态绑定,再入库试试(因为你这是单张表),所以还好弄。
    3. plsql读文件确实不如pro*c方便。有兴趣可以一试。不过,我建议,第一种方式真的可以一试,我曾经用这种方法,导入过总量达20来G的数据。
      

  9.   

    谢谢您~!
    用sqlloader不行的,因为我在vc的程序中实时的将记录入库,
    如果依靠写文件再入库的话,虽然入库用sqlloader时间非常快
    但是vc写文件的速度还是很慢的,跟写数据库这种文件系统差不了多少,
    甚至效率更低。
    所以只能考虑存储过程了!!
    不知存储过程的表变量能缓存多大的空间?
      

  10.   

    建议使用OCI批量插入,速度很快的,可以跟sqlldr入库速度媲美