求助:为何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。
{{----}
相关问答:
exp user/password@dbname file=c:\table.dmp tables=jbitaku,jbitakum grants=y
然後按回車鍵 說明: user/password@dbname 分別表示用戶名,密碼和服務名 f ......
各位oracle高手,请教一下为什么oracle 10g在安装到百分之八十五的时候就报错不能继续安装?
内存多大? 重新下个数据库安装试试..
引用
各位oracle高手,请教一下为什么oracle 10g在安装到百分之八十五的时 ......
查了一天的blob,还是没理解到,我想在VC下存取二进制的文件,使用的是oo4o,照着帮助文档上面的写了写入数据库的代码,还是没写对,错误提示是this operation is not permitted on a empty LOB,这是什么意思啊?照 ......
两个表
请看 "Persons" 表:
name banji shunxu
yiyang 01 1
yiyang 02 1
lili 01 2
接下来请看 "xueke" 表:
name kemu shunxu
yiy ......