同事在测试环境做批量测试,通常都跑得很快,可是有次同事等了两三个小时,程序还是一直在跑着,就觉得很奇怪~~
1、一开始我们怀疑是不是服务器的资源不足才跑这么慢,因为这服务器是多个项目组共用的,因此我们先查看服务器资源 vmstat,服务器的资源是正常的
2、既然服务器的资源是正常的,那sql语句有问题的可能性就比较大了
通过查找出后台运行的的进程号,再根据oracle视图查找该程序正在运行的语句
select nvl(s.SQL_ADDRESS,s.PREV_SQL_ADDR),
nvl (s.SQL_HASH_VALUE,s.PREV_HASH_VALUE)
from v$session s,v$process p
where s.PADDR = p.ADDR
and p.PID = ?
在通过
select * from v$sqltext wher hash_value=?
3、查看该语句,我们发现该语句的执行计划是正常的;
4、这时,我们考虑到会不会该表被锁着呢
(1)通过查看v$loced_object发现存在两个object_id一样,而且锁的模式都是一样的3,且该object_id就是我们正在执行语句的的表之一
(2)通过sid查找v$lock中条件type='[tx'中查找这两被锁的记录发现
其中存在
SID LMODE REQUEST BLOCK
1 0 6 0
2 6 0 1
这样就发现 会话sid 2正在阻塞其他会话,而会话1 正在等待一个LMODE=6的锁,被阻塞着。会话2阻塞者会话1
这时,我们就查找下为什么会出现会话1呢?原来是其他同事刚好在修改该对象的数据,而没提交。
这样,我们就把会话1给删掉,之后该程序就很快跑过了,不用3分钟就完了。
alter system kill session 'sid,serial#'
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/24242729/viewspace-762766/
,如需转载,请注明出处,否则将追究法律责任。