在我的一个应用程序里,完成一次交易需要访问四次数据库,前两次的数据库操作只有一些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空闲率都是很高的,文件系统剩余空间也较多。
问题相当的怪,查了一周多的问题了都没能查明原因,还请各位高手帮忙,看看有哪些情况会引起执行存储过程突然变慢,但只是有事务控制的存储过程变慢,其它的仍然很快。谢谢!!!
第一步:进行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空闲率都是很高的,文件系统剩余空间也较多。
问题相当的怪,查了一周多的问题了都没能查明原因,还请各位高手帮忙,看看有哪些情况会引起执行存储过程突然变慢,但只是有事务控制的存储过程变慢,其它的仍然很快。谢谢!!!
解决方案 »
- ORACLE报表中的SQL表达式
- 关于rownum问题?
- sqlload能清空表的数据吗?
- 高手们帮忙: 用decode()和case when end那个效率高啊。
- 急:ora-12699本机服务内部错误,愿呈上100分
- informix日期与oracle日期区别!
- 高分在线等待!!!当场解决当场给分!
- 奇怪,请帮我看看这个组合的简单SQL,动态执行总说不对。谢谢
- 请帮忙Global Temporary Table
- oracle 安装在ubuntu 中主账号无法tnsping 通 oracle账号下的oracle
- 关于insert的问题
- PL/SQL 问题,用BATOOL 工具在程序中写3个过程,我用一个过程调用另外两个过程出现ORA-01403错误
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;说明数据库并没有负载,由于此应用系统没有其他人员使用,说明并没有发送相关请求;
完全可以通过Oracle的存储子过程来处理,存储子过程本身就能处理好数据库并发问题,而且效率更高。