论坛首页 综合技术论坛

oracle批量插入导致的问题

浏览 5159 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-05-08  
    说实话,我对oracle的了解完全是赶鸭子上架,几乎为零,看了看例子就开始写存储过程了,所以问题也很快就出现了,问题如下:
     有这样一个表,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万和十几万的样子。其他都较少,几千到一万的样子吧。
    该怎么解决呢,先谢谢大家了. 
   发表时间:2007-05-08  
分段提交事务呢
0 请登录后投票
   发表时间:2007-05-08  
楼上好主意,一次几千好了。

另外就是这种把数据库中的表当队列用的模式本来就不好。
太多的插入与删除操作了。
0 请登录后投票
   发表时间:2007-05-08  
尽量减少并发可能才是办法。
0 请登录后投票
   发表时间:2007-05-09  
hehe,现在采用的解决办法是,专门写了一个监测程序,当进程a开始大批量的插入数据时监测程序就把其他进程强行杀掉,等过5分钟后在重新把其他进程启动起来。总觉得这样很变态,有点头疼医头脚疼医脚的意思。我试试分段提交。
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics