内存中有几十万条记录要写入到数据库中,一般是如何实现的,以前没有接触过数据库,还不清楚要怎么做,只知道一条条的insert是不行的。

解决方案 »

  1.   

    要看你用什么东西写了,如果你用java的话,我想就只有通过jdbc通过批处理提交来进行或把内存中的数据写入文件,然后用oracle的sqlldr进行处理。
    还有就是可以通过java调用oracle的过程,把内存中的数据通过一个集合传入oracle的过程中,在过程中用
    forall插入数据库,这样可以减少应用服务器的压力,并且过程在oracle服务器上执行,咋样免去了频繁的网络传输。
      

  2.   

    大批量数据用游标效率很低的,试试oracle上先建一个存储过程,输入参数用数组。
      

  3.   


    了解了一下几种方法分别为:
    1.逐条insert,
    2.批量insert,
    3.拼接成一个字符串如 insert into tablename(c...) values (x1), (x2),(x3),....(xn)
    其中第三种方法效率比前两种方法高,前两种差别不大,存储过程将数组作为参数传进去的还没有试过,主要是刚开始搞数据库,还不是很了解。 希望大家能提供一下参考的方法, 就如一般的网游中,数据的存储都不是立即,而是一段时间数据才保存一次,现在要改为更短的时间内就提交到数据库,以减少故障发生时数据的丢失。
      

  4.   

    如果我执行了 insert,但是没有调用commit,是不是就没有真正的保存到数据库里面? 一般像oracle都有个自动提交的设置的,是否需要把它关闭?
      

  5.   

    你先建一个临时表。
    然后用pl/sql
    用cursor实现
      

  6.   

    加大回滚段
    batch insert
    或者
    append insert方式
    insert /*+ append */ into ***
      

  7.   


    楼主,第三种方法你是否在ORACLE内部试过,这种语法貌似只在MYSQL上好用吧,ORACLE能用嘛,我在很多ORACLE版本上做过很多次试验,貌似都不好用呢,其实很多时候自己简单做下试验比较好一点,那样才能得到一些结论吧,然后再根据参考信息和资料来论证结论和梳理知识面。另外逐条INSERT一般是不合理的,海量数据插入一般都是需要批处理的,即使你提交到存储过程中,也是一种批处理,批处理本身就是将一个绑定变量的SQL和一批数据一次提交的ORACLE去执行的,所以你可以选择批处理或者提交分批提交到存储过程中去执行。另外要分批,不要一次把几十万一次弄过去,那样数据库受不了,因为你没有提交,脏块就还在,数据量大如果回滚段冲掉会有问题,而且这使得表对象长期处于征用状态,虽然其征用的幅度并没有像UPDATE和DELETE那么严重,但是毕竟对于单表的事务,毕竟有一个序列化的控制。这个大量数据写入,并非要多快的速度,适当控制速度来保证系统的稳定性运行。另外用临时表也不是没有道理,就是拿临时表做一个中间转换,然后用临时表INSERT /*+append*/INTO table_name NOLOGGING SELECT ... FROM 临时表;因为临时表有一个重大特征就是你写入它的时候基本就在内存中而且几乎没有日志信息,所以很快,然后从它那边转存过来的时候用高水位线插入并配合NOLOGGING使得写入时的日志非常少,降低开销。