相信熟悉Oracle的人经常会碰到一下几个问题:
1. CPU利用率过高
2. 磁盘争抢平凡(IO过高)
3. 执行存储过程中遇到和预计的时间相差很悬殊
以上这几个问题非常棘手,特别是第三点,特别是在金融行业,交易系统一般需要在晚上非交易时间内计算完庞大的数据,否则就会影响到第二天的交易
针对以上几个问题,我来讲一下在一起项目中碰到过的一次Procedure的经历
操作系统:Red Hat Linux 9
数 据 库:Oracle 9.2.0.4
问题描述:原本计算在30分钟运行完的Procedure,居然跑了2个半小时,而且明显CPU过高
首先我们通过查看alert*.log,并没有在运行过程当中出现任何的警告和错误信息
那么我们就要查看一下SQL到底在做些什么事情,查询SQL如下所示:
select sql_text,spid,b.program,process
from v$sqlarea a,
v$session b,
v$process d
where a.address = b.sql_address
and a.hash_value = b.sql_hash_value
and b.paddr = d.addr
and d.spid in (进程ID);
进程ID我们可以通过TOP命令查看到
得出有一条SQL语句在运行中竟然耗费了将近1.5小时的时间,并且CPU占用的非常大
所以基本上可以断定是这条SQL语句造成的,所以我们可以通过以下2个方面来进行处理:
首先我们通过查看v$session_wait来查看队列,SQL如下:
SQL>select sid,event,p1,p1text from v$session_wait
通过查看,大多都属于latch free状态,那么我们就查一下是什么原因产生了latch free状态,SQL如下:
SQL>select spid from v$process where addr in (select paddr from v$session where sid in(.........));
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/111631/viewspace-586475/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/111631/viewspace-586475/