这种情况估计是出现了等待写入日志组的现象。 解决方法如下: 1、不要频繁提交。 2、有大对象的操作可以用nologging方式进行,如alter table test nologging; insert/*+append */ into test ……; 3、增加日志组个数,适当增大日志组尺寸(比较麻烦,可以不用)。
关键在Update Image set BLOB字段 = 新值 where ...;极有可能是这个语句造成插入的时间越来越慢。当然,批量操作最好不要一个频繁commit。
bobfang说得比较对,我将Insert和Update两个语句合并了,可以直接插入数据而无需创建empty_blob()对象,事后发现的确插入效率提高了很多,但是问题还是存在,就是当入库数据量超过15幅之后,入库的效率依然很低,由初始的70秒到后来的230秒左右。tangren和etsilence说的修改事务长度考虑有道理,但是由于插入操作是封装好的函数不好修改;nologging方式好像必须跟insert/*+append */ into ... select一起使用才用效果,append方式添加记录对insert into ... values语句不起作用。我还测试了下,我将程序关闭后再启动入库操作,单幅入库的时间还是保持在230秒左右,重新启动数据库所在机器也不行,只有当我关闭数据库所在机器,然后再开机的时候,入库的效率才恢复到初始的70秒左右,很奇怪,感觉就像是数据库里面有个资源被占用没有得到释放,或者说是哪个参数需要设置一下,但是我在程序中已经将跟数据库相关的连接等资源都释放了。
2、不要频繁提交(比如可插入1000行提交一次);
3、查看一下CPU和IO的状态,瓶颈在哪。
解决方法如下:
1、不要频繁提交。
2、有大对象的操作可以用nologging方式进行,如alter table test nologging; insert/*+append */ into test ……;
3、增加日志组个数,适当增大日志组尺寸(比较麻烦,可以不用)。