查询占CPU高的oracle进程执行的SQL语句或JOB



           

1:首先使用TOP命令查到占用CPU高的SPID号(大P按照CPU排序)
30146  oracle    15  0 9889m 441m 438m R 63.7  1.4   5:43.88 oracle 

27290   oracle   15   0 9889m 3.3g 3.3g R 57.810.5  12156:59 oracle  

27301   oracle   16   0 9889m 3.3g 3.3g R 57.110.5  12017:09 oracle  


2
:使用DBA账户登录数据库,使用以下SQL语句查询到SQL相关信息
select * from v$process where spid = 30146;

 

3:根据以上查询到的信息(SID)使用以下SQL查询哪个客户端占用大量资源
SELECT sid, program FROM V$SESSION S WHERE EXISTS(SELECT 1 FROM V$PROCESS WHERE spid=30146 AND ADDR = S.PADDR);

 


4.
根据SID查得sqltext,查询语句如下:(查询到具体进程在数据库中执行的sql语句)

select sql_text from v$sqltext a where a.hash_value=(select sql_hash_value from v$session b where b.SID='&sid') order by piece ASC;

 

通过操作系统脚本获取现在最占资源的进程及正在执行的SQL

#!/bin/bash

 

ps -e -o pcpu -o pid -o user -o

args | grep oraclemktdb | sort -k 1| tail -5r

spid=`ps -e -o pcpu -o pid -o user -o

args | grep oraclemktdb | sort -k 1| tail -5r | awk'{print $2}'`

for i in $spid

do

sqlplus -S /nolog << EOF

conn / as sysdba

set feedback off

set linesize 200

set pagesize 70

column spid format 99999

column sid format 99999

column module format a20

column username format a8

column sql_text format a60

select distinct c.spid,b.sid,b.username,

a.module,a.hash_value,sql_text

from v$sql a,v$session b,v$process c

where a.hash_value=b.sql_hash_value and

a.address=b.sql_address and b.paddr=c.addr and c.spid=$i;

exit

EOF

done

 

 

----

 

Select a.Username, a.SID, a.SERIAL# ,b.Sql_Text,c.spid

From V$Session a, V$Sqlarea b,v$process c

Where a.Username 'HYJ'

And a.Username Is Not Null

And (a.Sql_Address = b.Address Or a.Prev_Sql_Addr =b.Address)

and a.PADDR=c.ADDR

and c.SPID='860464'

 

 

==========================================================================================================================================

 


根据lockwait字段可以查询当前正在等待的锁的相关信息:

select * from v$lock where kaddr in (select lockwait from v$session where sid = &sid);

 

(sql_address,sql_hash_value)(prev_sql_addr,prev_hash_value) 根据这两组字段, 可以查询到当前session正在执行的或最近一次执行的sql语句的详细信息:

select * fromv$sqltext where address = &sql_address and hash_value =&sql_hash_value;

 

根据PIDSQL相关信息:

select id,serial#,username,osuser,machine,program,process,to_char(logon_time,'yyyy/mm/ddhh24:mi:ss') logon from v$session where paddr in ( select addr from v$processwhere spid in('&pid'));

 

根据PIDSQL语句:

SELECTa.username,a.machine,a.program,a.sid,a.serial#,a.status,c.piece,c.sql_text FROMv$session a,v$process b,v$sqltext c WHERE b.spid='&spid' AND b.addr=a.paddrAND a.sql_address=c.address(+) ORDER BY c.piece;

 

根据PID得到进程的sid号:

select id,serial#,username,osuser,machine,program,process,to_char(logon_time,'yyyy/mm/ddhh24:mi:ss') logon from v$session where paddr in ( select addr from v$processwhere spid in('&pid'));

 

根据PID得到sessionsqltext语句:

select sql_text fromv$sqltext_with_newlines where hash_value in (select SQL_HASH_VALUE fromv$session where paddr in (select addr from v$process where spid= '&pid'))order by piece;

 

 





















此文整理自网络和实践。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值