求助:为何Oracle数据库Insert记录的速度越来越慢
自己写了一个基于Oracle的数据入库存储的程序,实现对每幅影像数据进行分块后插入到指定的表中,其基本操作过程如下:
begin Transaction;
insert into Image values(值1,值2,值3,empty_blob());
Update Image set BLOB字段 = 新值 where ...;
commit;
开辟了三个线程来同时执行上述插入操作,对于一幅划分为25000块的影像插入的速度大概在90秒但是当连续插入超过大约15幅之后(每幅影像插入到单独的一个表中),单幅影像插入消耗的时间不断增大,一幅25000块的影像插入的时间上升到300多秒,不知是何缘故,小弟刚开始接触,望路过的各位大侠帮忙指点一二,是否有什么参数需要调整?
每插入一个数据块都执行了一次commit操作,每个新开辟的线程都是对应着一个新的数据库连接,线程执行完之后也通过Close()、Dispose()方式关闭了数据库连接。后来又尝试将整个插入过程定义成存储过程的形式,却发现多线程下执行存储过程的效率还不如不使用存储过程的方式。
------解决方案--------------------1、事务长度要合适;
2、不要频繁提交(比如可插入1000行提交一次);
3、查看一下CPU和IO的状态,瓶颈在哪。
------解决方案--------------------这种情况估计是出现了等待写入日志组的现象。
解决方法如下:
1、不要频繁提交。
2、有大对象的操作可以用nologging方式进行,如alter table test nologging; insert/*+append */ into test ……;
3、增加日志组个数,适当增大日志组尺寸(比较麻烦,可以不用)。
------解决方案--------------------关键在Update Image set BLOB字段 = 新值 where ...;极有可能是这个语句造成插入的时间越来越慢。当然,批量操作最好不要一个频繁commit。