浏览 5159 次
锁定老帖子 主题:oracle批量插入导致的问题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-05-08
有这样一个表,sms_to_be_sent,有几个进程来循环操作它。进程a负责判断有没有合适的数据,如果有的话生成一批数据,插入到这个表中。其他进程都是扫描这个表中有没有符合自己的数据,有的话取出这些数据,进行业务逻辑处理,同时把这些数据从表中删除掉。这些进程都是调用的存贮过程进行的数据库的操作。a每30秒执行一次数据库操作,其他进程要频繁的多。 现在的问题是,当一次性插入的数据比较多时会执行时间过长。以前一次性插入7万条数据,执行的时间大概在120秒左右,现在的数据增大到了25万后,执行的时间竟然超过了半个小时,已经远远超过了可接受的范围!!我们做了实验,当把其他的进程都停掉只有a来执行时,25万条数据不到两分中就插完了。所以怀疑产生了锁等待的现象。可是,怎么解决呢,有谁碰到过相似的问题吗? 进程a调用的存贮过程的大体结构如下: procedure ScanTask(条件1) begin loop if 条件1 不符合 then 退出循环; end if; SendTaskMsgToUsersByTaskId(条件1);//向sms_to_be_sent插入数据 end loop; end procedure; SendTaskMsgToUsersByTaskId(条件)是向sms_to_be_sent批量插入数据数据的函数,根据"条件"的不同,每次的生成的数据的数量也不尽相同。 现在的情况是loop循环了大概6-7次的样子,也就是SendTaskMsgToUsersByTaskId被调用了6,7次,有两次数据较多,分别为7万和十几万的样子。其他都较少,几千到一万的样子吧。 该怎么解决呢,先谢谢大家了. ![]() 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-05-08
分段提交事务呢
|
|
返回顶楼 | |
发表时间:2007-05-08
楼上好主意,一次几千好了。
另外就是这种把数据库中的表当队列用的模式本来就不好。 太多的插入与删除操作了。 |
|
返回顶楼 | |
发表时间:2007-05-08
尽量减少并发可能才是办法。
|
|
返回顶楼 | |
发表时间:2007-05-09
hehe,现在采用的解决办法是,专门写了一个监测程序,当进程a开始大批量的插入数据时监测程序就把其他进程强行杀掉,等过5分钟后在重新把其他进程启动起来。总觉得这样很变态,有点头疼医头脚疼医脚的意思。我试试分段提交。
|
|
返回顶楼 | |