在我的一个应用程序里,完成一次交易需要访问四次数据库,前两次的数据库操作只有一些select等查询、统计语句,而最后两步需要进行update、行锁、提交等操作。程序为多线程并发运行。例
   第一步:进行select a into ... from XX 等
   第二步:进行select b into ... from YY 等
   第三步:select a into v_a from ZZ for update ;
           一些判断及insert、update语句等,最后commit或rollback;
          但针对insert及update都是单条记录操作。
   第四步:select b into v_b from WW for update;
           一些判断及一个update语句,最后commit或rollback;
   事务控制大部分会执行commit,10个线程并发执行,每天的交易量有不少,4万次左右,ZZ表也较大,但访问时是走索引的,在某一个线程的第三步或第四步慢时,其它线程的后两步操作在这个时间范围也同样很慢,但在同一时刻所有线程得以恢复,但在执行慢的时刻内前两步数据库非常快。
  以前都运行得很正常,前两天有几次发现后两步操作有时执行比较慢,需要一两分钟,而以前瞬间就执行完了,没进行任何处理,这几天又一直很正常,迅速执行完了。
  首先应该不是数据库的效率的问题,因为后两步访问的表也都不大或者是有索引,而且进行更新的记录都是单条处理的。
  其次应该与存储没关系。因为在后两步超时出现问题时,另一个线程的前两步操作都是很快的。出现某一刻存储出现问题,应该所有操作都会超时。
  最后应该与主机性能没有关系。在出现问题的那几次里,主机的CPU及IO空闲率都是很高的,文件系统剩余空间也较多。
    问题相当的怪,查了一周多的问题了都没能查明原因,还请各位高手帮忙,看看有哪些情况会引起执行存储过程突然变慢,但只是有事务控制的存储过程变慢,其它的仍然很快。谢谢!!!

解决方案 »

  1.   

    补充:
       1、应用布曙在两台机器热备运行。主机性能不是问题。一台是4CPU4GMEM,CPU空闲率为99%,内存空闲1.8G左右;另一台是8CPU16GMEM,CPU空闲率为99.9%,内存空闲14.5G左右;
       2、主机使用双链路与存储交换机及EMC8730相连,目前DB使用5块磁盘;通过POWERMT 命令可以看到上午10:10分至10:30分之间,双通道上磁盘只是偶尔会出现几个i/o ,与其它主机每秒几百个I/O相比,磁盘性能应该不是出现故障的原因.
       3、曾经调整过应用主机DBC_PCT_MAX和DBC_PCT_MIN,这两个参数作用是允许将OS内存用着文件缓存的最大比例和最小比例,我的应用使用的裸设备作为数据文件,不需要使用缓存,另外由于当时MAX是50%,OS所余下的内存只有150M.所以才调整这两个参数的,应该与此没关系
       4、应该不是网络的问题。当时也检查了当初的数据库连接情况,当时有连接,但基本上没有ACTIVE的SESSION;说明数据库并没有负载,由于此应用系统没有其他人员使用,说明并没有发送相关请求;
      

  2.   

    是不是ZZ for update ;和WW for update在等待?
      

  3.   

    难道楼主非要进行四次访问数据库,而不把这些操作一次性完成?
    完全可以通过Oracle的存储子过程来处理,存储子过程本身就能处理好数据库并发问题,而且效率更高。